<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Operator Lifecycle Manager – Best Practices</title><link>https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/</link><description>Recent content in Best Practices on Operator Lifecycle Manager</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><atom:link href="https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: Common recommendations and suggestions</title><link>https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/common/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/common/</guid><description>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Any recommendation or good practice suggested by the Kubernetes community such as to develop &lt;a href="https://kubernetes.io/docs/concepts/extend-kubernetes/operator/">Operator pattern&lt;/a> solutions or to manage them are good recommendations for who is looking for to build the operator projects and distribute them with OLM. Also, see &lt;a href="https://sdk.operatorframework.io/docs/best-practices/best-practices/">Operator Best Practices&lt;/a> and ensure that you check out &lt;a href="https://master.sdk.operatorframework.io/docs/best-practices/best-practices/#running-on-cluster">Running On-Cluster&lt;/a>.&lt;/p>
&lt;h2 id="validate-your-bundle-before-publish-it">Validate your bundle before publish it&lt;/h2>
&lt;p>Check and test your operator bundle before you publish it. Note that the &lt;a href="https://github.com/operator-framework/operator-sdk">&lt;code>operator-sdk&lt;/code>&lt;/a> CLI can help with that process. You can validate a bundle via &lt;a href="https://sdk.operatorframework.io/docs/cli/operator-sdk_bundle_validate/">&lt;code>operator-sdk bundle validate&lt;/code>&lt;/a> against the entire suite of validators for Operator Framework, in addition to required bundle validators:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>operator-sdk bundle validate ./bundle --select-optional &lt;span style="color:#000">suite&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>operatorframework
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>OperatorHub.io&lt;/code> validator in the &lt;code>operatorframework&lt;/code> optional suite allows you to validate that your manifests can work with a Kubernetes cluster of a particular version using the &lt;code>k8s-version&lt;/code> optional key value:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>operator-sdk bundle validate ./bundle --select-optional &lt;span style="color:#000">suite&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>operatorframework --optional-values&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>k8s-version&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>1.22
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Also, you can validate a bundle via &lt;a href="https://sdk.operatorframework.io/docs/cli/operator-sdk_scorecard/">&lt;code>operator-sdk scorecard&lt;/code>&lt;/a> to insure it against a suite of tests:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>operator-sdk scorecard bundle
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="provide-what-are-the-k8s-versions-supported-by-your-project">Provide what are the k8s versions supported by your project&lt;/h2>
&lt;p>In the &lt;a href="https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/concepts/crds/clusterserviceversion">CSV&lt;/a> manifest of your operator bundle, you can set the &lt;code>spec.minKubeVersion&lt;/code> property to inform what is the minimal Kubernetes version which your project supports:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">...&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">maturity&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">alpha&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#0000cf;font-weight:bold">0.4.0&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">minKubeVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#0000cf;font-weight:bold">1.16.0&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It is recommended you provide this information. Otherwise, it would mean that your operator project can be distributed and installed in any cluster version available, which is not necessarily the case for all projects.&lt;/p></description></item><item><title>Docs: Channel Naming</title><link>https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/channel-naming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/channel-naming/</guid><description>
&lt;h2 id="channels">CHANNELS&lt;/h2>
&lt;p>Operator Lifecycle Manager (OLM) provides a channel concept that allows you
as the operator author a means to specify a set of update streams for your
operator.&lt;/p>
&lt;p>Operator authors deal with two key tasks associated with OLM channels, first,
how to define a channel for your operator and then lastly how to interact
with OLM to deploy your operator using channels.&lt;/p>
&lt;p>For each version of an operator you can specify a channel that it will belong
to. Since there can be multiple versions of an operator within a channel,
there is a notion of the latest version within a channel, or the channel head
version. It&amp;rsquo;s the channel head that OLM will install for most subscriptions.&lt;/p>
&lt;p>There can also be multiple channels for a given operator package which is
used to offer different support models (e.g. pre-release, production). Here
is a diagram that shows the relationship of operator versions to channels:&lt;/p>
&lt;p>&lt;img src="https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/images/channel-naming1.png" alt="Channel Naming Image">&lt;/p>
&lt;p>In the diagram above you can see the following:&lt;/p>
&lt;ul>
&lt;li>A catalog named “vendor:v4.6”, this catalog is built by a cluster administrator typically&lt;/li>
&lt;li>There are 2 operator packages found in the catalog, myoperator and otheroperator.&lt;/li>
&lt;li>The myoperator has 3 bundles (1.0.0, 1.0.1, 1.0.2). Versions 1.0.0 and 1.0.1 are in multiple channels (fast, stable). Whereas version 1.0.2 is only in the fast channel.&lt;/li>
&lt;li>The otheroperator has 2 bundles specifying 2 different channels (candidate, stable). Version 1.4.0 specifies it is within 2 channels, stable and candidate.&lt;/li>
&lt;/ul>
&lt;p>Here is the view of another catalog, “vendor:v4.7”, that shows you can change
the upgrade path for an operator by what operator bundles are contained
within the catalog:&lt;/p>
&lt;p>&lt;img src="https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/images/channel-naming2.png" alt="Channel Naming Image">&lt;/p>
&lt;h3 id="defining-channels">Defining Channels&lt;/h3>
&lt;p>Operator authors define the channels they intend to use by creating labels within their operator bundle. Bundles contain metadata about a particular operator version. For example, when you build an operator bundle, you specify an annotations.yaml manifest which gets included into the bundle image. Here is an example snippet of an annotations.yaml file including channel information for that operator:&lt;/p>
&lt;pre tabindex="0">&lt;code>annotations:
operators.operatorframework.io.bundle.channels.v1: candidate
operators.operatorframework.io.bundle.channel.default.v1: candidate
operators.operatorframework.io.bundle.manifests.v1: manifests/
operators.operatorframework.io.bundle.mediatype.v1: registry+v1
operators.operatorframework.io.bundle.metadata.v1: metadata/
operators.operatorframework.io.bundle.package.v1: otheroperator
&lt;/code>&lt;/pre>&lt;p>This example shows that you are defining the candidate channel to be used for
this operator bundle. Operator bundles are loaded into an Operator Index
image using the opm command. It is important to note that by specifying a
channel value like this, you are essentially creating a channel which can
then be subscribed to. If you mis-type the channel name, there is nothing
that validates the channel value because the channel is known by whatever
you provide.&lt;/p>
&lt;p>Note that you can specify a default channel for a given operator package. This
default channel is used when an operator is being installed to fulfill
a dependency requirement of another operator. The dependent operator will
be installed from the dependent operator’s default channel as the first
choice, falling back to other channels the dependent operator provides as
necessary. Default channels for an operator package are determined by the
order in which operator bundles are added to the catalog, with the last
bundle’s default channel value being used. Note the default channel is
also used if you create a Subscription that doesn’t specify a channel.&lt;/p>
&lt;p>If your operator bundles do not specify a default channel, a default channel
will be picked by OLM based on the lexical ordering of the channels you have
specified. For example, if your bundles specified channels of candidate and
stable, then candidate would be picked based solely on the names chosen and
character ordering (e.g. ‘p’ comes before ‘s’). Dependency resolution is
described in more detail &lt;a href="https://olm.operatorframework.io/docs/concepts/olm-architecture/dependency-resolution/">here&lt;/a>.&lt;/p>
&lt;h3 id="deploying-operators-from-channels">Deploying Operators from Channels&lt;/h3>
&lt;p>When an end user or administrator wants to deploy an operator using OLM,
they create a &lt;a href="https://olm.operatorframework.io/docs/concepts/crds/subscription/">Subscription&lt;/a> manifest, e.g:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">operators.coreos.com/v1alpha1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Subscription&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">sample-subscription&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">namespace&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">my-operators&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">channel&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">candidate&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">sampleoperator&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">source&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">sample-operator&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">sourceNamespace&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">my-operators&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;a href="https://olm.operatorframework.io/docs/concepts/crds/subscription/">Subscription&lt;/a> is providing hints to OLM which are used to determine exactly which version of an operator will get deployed onto the cluster, in this example OLM will look for an operator to deploy that belongs to the candidate channel within a specified catalog source.&lt;/p>
&lt;p>Note that exactly which operator version is deployed can depend on more than what you specify in the &lt;a href="https://olm.operatorframework.io/docs/concepts/crds/subscription/">Subscription&lt;/a>. On initial install, OLM will always attempt to install whatever is the head of the specified channel by default. Settings within the operator’s CSV also are used by OLM to determine exactly which operator version OLM will deploy or upgrade.&lt;/p>
&lt;h2 id="naming">NAMING&lt;/h2>
&lt;p>Channel names should imply the nature of official support the user can expect when subscribed to that channel for your operator. For example, the channel name &lt;code>stable-v2&lt;/code> implies that subscribing to this channel will install an operator with a major version &lt;code>v2&lt;/code> that you can expect official support for. The channel name &lt;code>candidate-v2&lt;/code> implies that the user will be installing a candidate release version that does not have official supported.&lt;/p>
&lt;p>Our motivation with this convention is to encourage a better user experience for OLM users to have an intuitive
understanding of the level of maturity and supportability of the solutions that will get installed.
It can get very confusing for cluster admins and Operator consumers in general when each solution distributed in the OLM catalog adopts different names or different meanings for the same terminologies.&lt;/p>
&lt;p>The names you choose are notional and up to you to decide, however, picking good channel names requires some basic guidance. What is described below are different channel naming conventions that are commonly used by the operator community to denote different operator upgrade use cases.&lt;/p>
&lt;h3 id="naming-conventions">Naming Conventions&lt;/h3>
&lt;ul>
&lt;li>Channel names are chosen by operator authors as they see fit to meet their upgrade strategies.&lt;/li>
&lt;li>Channel names should communicate the release strategy, official support level and the level of maturity, but &lt;strong>not&lt;/strong> specific features. ( e.g. a channel with Operator versions which has official support ought to be have the word &lt;code>stable&lt;/code> in the channel name, whereas a channel with Operator versions with a non-supported feature should have the phrase &lt;code>tech-preview&lt;/code>in it&amp;rsquo;s name. ).&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>Note:&lt;/strong> If your new operator version release contains an API(CRD), which represents new experimental features and
is not supported (like &amp;ldquo;tech-preview&amp;rdquo;), then the recommendation is to capture the maturity in the API version
(that is group: my.example.com, kind: Backup, version: v1alpha1) and not in the channel name.
This follows &lt;a href="https://kubernetes.io/docs/reference/using-api/#api-versioning">Kubernetes API versioning&lt;/a> recommendations.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>Channel names are unique to your operator and do not collide with channel names used by other operator providers.&lt;/li>
&lt;li>Seldom is there a situation where your channel names need to contain information about the Kubernetes or Openshift cluster version they run on. Only in the case where your operator versions have a dependency on the Kubernetes/Openshift version would you include the cluster version in your channel name.&lt;/li>
&lt;li>You typically would &lt;strong>not&lt;/strong> include product names in your channels since the channels are unique to your product and will not collide with other channel names used by other operators.&lt;/li>
&lt;li>You could include or have an operand version in your channel name to advertise to consumers the version of operand they can subscribe to.&lt;/li>
&lt;li>If you do choose to include some version in your channel name, it is important to include an additional identifier, to clarify what that the version number is referring to. A version number could equally be referring to product version (operand version), or operator version - these two don&amp;rsquo;t always match: the operator itself can have different versioning than the product it is managing.&lt;/li>
&lt;li>It is recommended to use at least the major versions of your Operator releases in the channel names. Cluster admins can then better plan the consumption of versions of Operators introducing breaking changes and avoid workflow issues. (e.g. &lt;code>stable-v2.x&lt;/code>)&lt;/li>
&lt;/ul>
&lt;h3 id="recommended-channel-naming">Recommended Channel Naming&lt;/h3>
&lt;h4 id="example-1">Example 1&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Channel Name&lt;/th>
&lt;th style="text-align:left">Purpose&lt;/th>
&lt;th style="text-align:left">Supported&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">candidate&lt;/td>
&lt;td style="text-align:left">Pre-release operators that would typically not have support offered and might be considered experimental. Release candidates contain all the features of the product but are not supported. Use release candidate versions to test feature acceptance and assist in qualifying the next version of Operator. A release candidate is any build that is available in the candidate channel, including ones that do not contain a pre-release version such as &lt;code>-rc&lt;/code> in their names. After a version is available in the candidate channel, it goes through more quality checks. If it meets the quality standard, it is promoted to the &lt;code>fast&lt;/code> or &lt;code>stable&lt;/code> channels. Because of this strategy, if a specific release is available in both the &lt;code>candidate&lt;/code> channel and in the &lt;code>fast&lt;/code> or &lt;code>stable&lt;/code> channels, it is a supported version. The &lt;code>candidate&lt;/code> channel can include release versions from which there are no recommended updates in any channel.&lt;/td>
&lt;td style="text-align:left">No&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">fast&lt;/td>
&lt;td style="text-align:left">Released, supported operators which are still being monitored to assess stability/quality prior to promoting them as stable. Generally used by early adopters or for testing in pre-production environments. The &lt;code>fast&lt;/code> channel ought to be updated with new and previous minor versions of the Operator as soon as it declares the given version as a general availability release. As such, these releases are fully supported, are production quality, and have performed well while available as a release candidate in the &lt;code>candidate&lt;/code> channel from where they were promoted. Some time after a release appears in the &lt;code>fast&lt;/code> channel, it is added to the &lt;code>stable&lt;/code> channel. If you adopted the &lt;code>fast&lt;/code> and/or &lt;code>candidate&lt;/code> channel then, releases never should appear in the &lt;code>stable&lt;/code> channel before they appears in the &lt;code>fast&lt;/code> and/or &lt;code>candidate&lt;/code>. Please, make sure you understand the &lt;a href="https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/best-practices/channel-naming/#channel-promotion">CHANNEL PROMOTION&lt;/a>.&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">stable&lt;/td>
&lt;td style="text-align:left">Released, supported operators that have been observed to be stable through usage by consumers of the fast channel. While the fast channel contains releases as soon as their are published with a support statement, releases are added to the stable channel after a delay in this case. During this delay, data could to be collected, for example, to ensure the stability of the release.&lt;/td>
&lt;td style="text-align:left">Yes&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>With the above channel naming convention, you are always moving end users to the latest versions of your operator. For example, you could create a version &lt;code>1.1.1&lt;/code> that is considered fast, adding it to the fast channel. Users can experiment with that fast version, but the stable version for example &lt;code>1.2.0&lt;/code> would be added only to the stable channel.&lt;/p>
&lt;p>&lt;strong>NOTE&lt;/strong> The above terminology and support statements are very similar to the channels of distribution used by Kubernetes, (e.g &lt;a href="https://cloud.google.com/kubernetes-engine/docs/concepts/release-channels">here&lt;/a>), and popular vendors such as OpenShift (e.g &lt;a href="https://docs.openshift.com/container-platform/4.9/updating/understanding-upgrade-channels-release.html">here&lt;/a>). In this way, by adopting it you will bring a better and more intuitive understanding for the maintainers, users and community.&lt;/p>
&lt;h4 id="example-2">Example 2&lt;/h4>
&lt;p>By following the recommendation, you would provide the major versions of the Operators
in the channel naming. Consumers can then subscribe to a channel with confidence that none of the versions in the
channel will introduce breaking changes:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Channels for Operator version(s) v2.x&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">candidate-v2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">fast-v2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">stable-v2&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Attention:&lt;/strong> The versions on the channel names are related to the Operator version and not its Operands.&lt;/p>
&lt;h4 id="example-3-recommended-option-is-the-most-common-scenarios">Example 3 (Recommended Option is the most common scenarios)&lt;/h4>
&lt;p>An operator should be supported at various operator major/minor versions.&lt;br>
For example, you might have a &lt;code>v1.3&lt;/code> and also a &lt;code>v2.4&lt;/code> releases of your operator that
you need or want to offer support for at the same time. However, you might
not want to have OLM upgrade users to the &lt;code>v2.4&lt;/code> Operator but instead keep them
upgrading within the &lt;code>v1.3&lt;/code> versions. In that case, you would end up with channels as
recommended above but with major/minor version information applied as follows:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Channels for v1.3&lt;/th>
&lt;th style="text-align:left">Channels for v2.4&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">candidate-v1.3&lt;/td>
&lt;td style="text-align:left">candidate-v2.4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">fast-v1.3&lt;/td>
&lt;td style="text-align:left">fast-v2.4&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">stable-v1.3&lt;/td>
&lt;td style="text-align:left">stable-v2.4&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Attention:&lt;/strong> The versions on the channel names are related to the Operator version and not its Operands.&lt;/p>
&lt;h4 id="example-4-only-if-you-need-make-clear-for-your-users-the-operand-version">Example 4 (Only if you need make clear for your users the Operand version)&lt;/h4>
&lt;p>Another form of channel naming might have the operand version be specified
instead of the operator version. For example, consider a database operator
that has operands of different database versions such as Version 12 or
Version 13. In this case, you might have the need to advertise your
channels by the operand version as follows:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Channels for Postgres v12&lt;/th>
&lt;th style="text-align:left">Channels for Postgres v13&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">candidate-pg-v12&lt;/td>
&lt;td style="text-align:left">candidate-pg-v13&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">fast-pg-v12&lt;/td>
&lt;td style="text-align:left">fast-pg-v13&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">stable-pg-v12&lt;/td>
&lt;td style="text-align:left">stable-pg-v13&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>In this example, subscribers know which database version they are subscribing
to and don’t necessarily care which operator version is being used, but will
likely just want the latest operator version in that channel. As with the
previous naming convention examples, we start the channel name with
candidate/fast/stable to denote the maturity level of the operator. Using all
3 naming prefixes is optional, you might only want to support a stable channel.&lt;/p>
&lt;h1 id="channel-promotion">CHANNEL PROMOTION&lt;/h1>
&lt;p>Channel promotion is the notion of moving an operator from one channel to
another. For example, consider the case where you have an operator version
&lt;code>1.0.1&lt;/code> which is found in a candidate channel, then you might decide to offer
support for that version and want to move it to a stable channel.&lt;/p>
&lt;p>Today, channel promotion is achieved by creating a new operator version
(&lt;code>1.0.2&lt;/code>) that is labeled with the channel(s) you want to promote to (as well
as any channels you want to keep it in).&lt;/p>
&lt;h1 id="upgrades">UPGRADES&lt;/h1>
&lt;p>OLM provides a variety of ways to specify updates between operator versions. Before we continue with the following
recommendations, make sure you understand the options by checking &lt;a href="https://olm.operatorframework.io/docs/concepts/olm-architecture/operator-catalog/creating-an-update-graph/">Creating an update graph with OLM&lt;/a>.&lt;/p>
&lt;h2 id="recommended-upgrade-path">Recommended upgrade path&lt;/h2>
&lt;p>Within a channel each patch release should be directly upgradable to the &lt;a href="https://deploy-preview-345--operator-lifecycle-manager.netlify.app/docs/glossary/#channel-head">HEAD of channel&lt;/a>.
Use skips or skipRange to provide this behaviour. (i.e. if you followed the above &lt;code>Example 3&lt;/code> that means
use skipRange to publish a patch for &lt;code>3.6.z&lt;/code>under the&lt;code>stable-v3.6&lt;/code> would mean setting the skipRange to be
&lt;code>&amp;gt;= 3.5.z &amp;lt; 3.6.z&lt;/code>, where &lt;code>3.5.z&lt;/code> represents the oldest &lt;code>3.5.z&lt;/code> version for which
you can provide direct upgrade support to &lt;code>3.6.z&lt;/code> latest)&lt;/p>
&lt;h4 id="example">Example&lt;/h4>
&lt;p>Let&amp;rsquo;s imagine that you will be releasing the Operator bundle &lt;code>v3.6.30&lt;/code> (patch release under the channel &lt;code>stable-v3.6&lt;/code>) and
that you have published so far:&lt;/p>
&lt;ul>
&lt;li>Operator bundles versions from &lt;code>v3.5.0&lt;/code> to &lt;code>v3.5.25&lt;/code> under the &lt;code>stable-v3.5&lt;/code> channel&lt;/li>
&lt;li>Operator bundles versions from &lt;code>3.6.0&lt;/code> to &lt;code>3.6.29&lt;/code> under the &lt;code>stable-v3.6&lt;/code> channel&lt;/li>
&lt;/ul>
&lt;p>Then, in this case, your newer patch release &lt;code>3.6.30&lt;/code> would be configured with &lt;code>skipRange: &amp;gt;=3.5.25 &amp;lt; 3.6.30&lt;/code> in
order to only supports upgrading to the newest &lt;code>3.6.z&lt;/code> from a pretty recent &lt;code>3.5.z&lt;/code>.&lt;/p>
&lt;p>You do not need necessarily to use &lt;code>3.5.25&lt;/code>. Therefore, you should
use the oldest &lt;code>3.5.z&lt;/code> version that supports upgrades from. Be aware that the ability to configure the path
using this example from an Operator version like &lt;code>3.5.25&lt;/code> &lt;em>(or &lt;code>3.5.17&lt;/code>, or something else)&lt;/em>
instead of &lt;code>3.5.0&lt;/code> is a mechanism to constrain the support matrix when necessary, it&amp;rsquo;s not the default recommendation.&lt;/p>
&lt;p>&lt;strong>Note&lt;/strong> If you would like to ensure that the users of your Operator are still able to install the Operator bundle version
&lt;code>3.6.29&lt;/code> by using the option &lt;code>startingCSV&lt;/code> added manually in the subscription then, you will need to also use the &lt;code>replaces: 3.6.29&lt;/code>
to ensure the older Operator bundle does not get pruned from the index catalog via the OLM resolver.&lt;/p>
&lt;h4 id="attention-be-aware-of-the-following-scenario">Attention (Be aware of the following scenario)&lt;/h4>
&lt;p>If you have the channel &lt;code>stable-v3.7&lt;/code> where the head of channel is &lt;code>v3.7.10&lt;/code>, and you have a new patch release
with a bug fix using the Operator bundle version &lt;code>v3.7.11&lt;/code> , and you configure &lt;code>v3.7.11&lt;/code> to skip all
operator bundles published in the channel &lt;code>stable-v3.7&lt;/code> (e.g.&lt;code>v3.7.11&lt;/code> mentions skipRange: &lt;code>&amp;quot;&amp;gt;= 3.7.0 &amp;lt; 3.7.11&amp;quot;&lt;/code> replaces: &lt;code>3.6.z &amp;lt;latest release on 3.6 channel&amp;gt;&lt;/code> ).&lt;/p>
&lt;p>, you could ensure that your users can more easily upgrade to the latest version since they will
be able to install the new &lt;code>3.7.11&lt;/code> release directly from &lt;code>3.6.z &amp;lt;latest release on 3.6 channel&amp;gt;&lt;/code> instead of
having to upgrade through Operator version &lt;code>3.7.0&lt;/code> which may contain bugs that are already fixed in both the &lt;code>3.6.z&lt;/code>
version they had installed, and the &lt;code>3.7.11&lt;/code> version they are moving to.&lt;/p>
&lt;p>However, this approach has negative implications when you provide your next patch release to the minor channel &lt;code>stable-v3.6&lt;/code>.&lt;br>
Note that if you publish &lt;code>3.6.latest+1&lt;/code> when this version comes out, and your users upgrade to it, they will have no way to
upgrade from &lt;code>3.6.latest+1&lt;/code> to any solution published under the channel &lt;code>stable-v3.7&lt;/code>,
until you publish a new &lt;code>3.7.z&lt;/code> version that replaces `3.6.latest+1.&lt;/p></description></item></channel></rss>