Add kafka-operator (#74)

Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
This commit is contained in:
Andrei Kvapil
2024-04-13 08:56:07 +02:00
committed by GitHub
parent c24a103fda
commit 83bdc3f537
58 changed files with 38963 additions and 0 deletions

View File

@@ -70,6 +70,12 @@ releases:
namespace: cozy-postgres-operator
dependsOn: [cilium,cert-manager]
- name: kafka-operator
releaseName: kafka-operator
chart: cozy-kafka-operator
namespace: cozy-kafka-operator
dependsOn: [cilium,kubeovn]
- name: rabbitmq-operator
releaseName: rabbitmq-operator
chart: cozy-rabbitmq-operator

View File

@@ -44,6 +44,12 @@ releases:
namespace: cozy-postgres-operator
dependsOn: [cert-manager]
- name: kafka-operator
releaseName: kafka-operator
chart: cozy-kafka-operator
namespace: cozy-kafka-operator
dependsOn: [cilium,kubeovn]
- name: rabbitmq-operator
releaseName: rabbitmq-operator
chart: cozy-rabbitmq-operator

View File

@@ -99,6 +99,12 @@ releases:
namespace: cozy-postgres-operator
dependsOn: [cilium,kubeovn,cert-manager]
- name: kafka-operator
releaseName: kafka-operator
chart: cozy-kafka-operator
namespace: cozy-kafka-operator
dependsOn: [cilium,kubeovn]
- name: rabbitmq-operator
releaseName: rabbitmq-operator
chart: cozy-rabbitmq-operator

View File

@@ -44,6 +44,12 @@ releases:
namespace: cozy-postgres-operator
dependsOn: [cert-manager]
- name: kafka-operator
releaseName: kafka-operator
chart: cozy-kafka-operator
namespace: cozy-kafka-operator
dependsOn: [cilium,kubeovn]
- name: rabbitmq-operator
releaseName: rabbitmq-operator
chart: cozy-rabbitmq-operator

View File

@@ -0,0 +1,2 @@
name: cozy-kafka-operator
version: 0.3.0

View File

@@ -0,0 +1,15 @@
NAME=kafka-operator
NAMESPACE=cozy-kafka-operator
show:
helm template --dry-run=server -n $(NAMESPACE) $(NAME) .
apply:
helm upgrade -i -n $(NAMESPACE) $(NAME) .
diff:
helm diff upgrade --allow-unreleased --normalize-manifests -n $(NAMESPACE) $(NAME) .
update:
rm -rf charts
helm pull oci://quay.io/strimzi-helm/strimzi-kafka-operator --untar --untardir charts

View File

@@ -0,0 +1,21 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*~
# Various IDEs
.project
.idea/
*.tmproj

View File

@@ -0,0 +1,27 @@
apiVersion: v2
appVersion: 0.40.0
description: 'Strimzi: Apache Kafka running on Kubernetes'
home: https://strimzi.io/
icon: https://raw.githubusercontent.com/strimzi/strimzi-kafka-operator/main/documentation/logo/strimzi_logo.png
keywords:
- kafka
- queue
- stream
- event
- messaging
- datastore
- topic
maintainers:
- name: Frawless
- name: ppatierno
- name: samuel-hawker
- name: scholzj
- name: tombentley
- name: sknot-rh
- name: PaulRMellor
- name: im-konge
- name: see-quick
name: strimzi-kafka-operator
sources:
- https://github.com/strimzi/strimzi-kafka-operator
version: 0.40.0

View File

@@ -0,0 +1,20 @@
approvers:
- ppatierno
- scholzj
- tombentley
- samuel-hawker
- Frawless
- sknot-rh
- PaulRMellor
- im-konge
- see-quick
reviewers:
- ppatierno
- scholzj
- tombentley
- samuel-hawker
- Frawless
- sknot-rh
- PaulRMellor
- im-konge
- see-quick

View File

@@ -0,0 +1,224 @@
# Strimzi: Apache Kafka on Kubernetes
Strimzi provides a way to run an [Apache Kafka®](https://kafka.apache.org) cluster on
[Kubernetes](https://kubernetes.io/) or [OpenShift](https://www.openshift.com/) in various deployment configurations.
See our [website](https://strimzi.io) for more details about the project.
**!!! IMPORTANT !!!**
Upgrading to Strimzi 0.32 and newer directly from Strimzi 0.22 and earlier is no longer possible.
Please follow the [documentation](https://strimzi.io/docs/operators/latest/full/deploying.html#assembly-upgrade-str) for more details.
**!!! IMPORTANT !!!**
From Strimzi 0.40 on, we support only Kubernetes 1.23 and newer.
Kubernetes versions 1.21 and 1.22 are no longer supported.
## Introduction
This chart bootstraps the Strimzi Cluster Operator Deployment, Cluster Roles, Cluster Role Bindings, Service Accounts, and
Custom Resource Definitions for running [Apache Kafka](https://kafka.apache.org/) on [Kubernetes](http://kubernetes.io)
cluster using the [Helm](https://helm.sh) package manager.
### Supported Features
* **Manages the Kafka Cluster** - Deploys and manages all of the components of this complex application, including dependencies like Apache ZooKeeper® that are traditionally hard to administer.
* **Includes Kafka Connect** - Allows for configuration of common data sources and sinks to move data into and out of the Kafka cluster.
* **Topic Management** - Creates and manages Kafka Topics within the cluster.
* **User Management** - Creates and manages Kafka Users within the cluster.
* **Connector Management** - Creates and manages Kafka Connect connectors.
* **Includes Kafka Mirror Maker 1 and 2** - Allows for mirroring data between different Apache Kafka® clusters.
* **Includes HTTP Kafka Bridge** - Allows clients to send and receive messages through an Apache Kafka® cluster via the HTTP protocol.
* **Includes Cruise Control** - Automates the process of balancing partitions across an Apache Kafka® cluster.
* **Prometheus monitoring** - Built-in support for monitoring using Prometheus.
* **Grafana Dashboards** - Built-in support for loading Grafana® dashboards via the grafana_sidecar
### Upgrading your Clusters
To upgrade the Strimzi operator, you can use the `helm upgrade` command.
The `helm upgrade` command does not upgrade the [Custom Resource Definitions](https://helm.sh/docs/chart_best_practices/custom_resource_definitions/).
Install the new CRDs manually after upgrading the Cluster Operator.
You can access the CRDs from our [GitHub release page](https://github.com/strimzi/strimzi-kafka-operator/releases) or find them in the `crd` subdirectory inside the Helm Chart.
The Strimzi Operator understands how to run and upgrade between a set of Kafka versions.
When specifying a new version in your config, check to make sure you aren't using any features that may have been removed.
See [the upgrade guide](https://strimzi.io/docs/operators/latest/deploying.html#assembly-upgrading-kafka-versions-str) for more information.
### Documentation
Documentation to all releases can be found on our [website](https://strimzi.io/documentation).
### Getting help
If you encounter any issues while using Strimzi, you can get help using:
* [Strimzi mailing list on CNCF](https://lists.cncf.io/g/cncf-strimzi-users/topics)
* [Strimzi Slack channel on CNCF workspace](https://cloud-native.slack.com/messages/strimzi)
* [GitHub Discussions](https://github.com/strimzi/strimzi-kafka-operator/discussions)
### License
Strimzi is licensed under the [Apache License, Version 2.0](https://github.com/strimzi/strimzi-kafka-operator/blob/main/LICENSE).
## Prerequisites
- Kubernetes 1.23+
## Installing the Chart
To install the chart with the release name `my-strimzi-cluster-operator`:
```bash
$ helm install my-strimzi-cluster-operator oci://quay.io/strimzi-helm/strimzi-kafka-operator
```
The command deploys the Strimzi Cluster Operator on the Kubernetes cluster with the default configuration.
The [configuration](#configuration) section lists the parameters that can be configured during installation.
## Uninstalling the Chart
To uninstall/delete the `my-strimzi-cluster-operator` deployment:
```bash
$ helm delete my-strimzi-cluster-operator
```
The command removes all the Kubernetes components associated with the operator and deletes the release.
## Configuration
The following table lists the configurable parameters of the Strimzi chart and their default values. Runtime
configuration of Kafka and other components are defined within their respective Custom Resource Definitions. See
the documentation for more details.
| Parameter | Description | Default |
|---------------------------------------------|---------------------------------------------------------------------------------|------------------------------|
| `replicas` | Number of replicas of the cluster operator | 1 |
| `watchNamespaces` | Comma separated list of additional namespaces for the strimzi-operator to watch | [] |
| `watchAnyNamespace` | Watch the whole Kubernetes cluster (all namespaces) | `false` |
| `defaultImageRegistry` | Default image registry for all the images | `quay.io` |
| `defaultImageRepository` | Default image registry for all the images | `strimzi` |
| `defaultImageTag` | Default image tag for all the images except Kafka Bridge | `0.40.0` |
| `image.registry` | Override default Cluster Operator image registry | `nil` |
| `image.repository` | Override default Cluster Operator image repository | `nil` |
| `image.name` | Cluster Operator image name | `cluster-operator` |
| `image.tag` | Override default Cluster Operator image tag | `nil` |
| `image.digest` | Override Cluster Operator image tag with digest | `nil` |
| `image.imagePullPolicy` | Image pull policy for all pods deployed by Cluster Operator | `IfNotPresent` |
| `image.imagePullSecrets` | List of Docker registry pull secrets | `[]` |
| `fullReconciliationIntervalMs` | Full reconciliation interval in milliseconds | 120000 |
| `leaderElection.enable` | Whether to enable leader election | `true` |
| `operationTimeoutMs` | Operation timeout in milliseconds | 300000 |
| `operatorNamespaceLabels` | Labels of the namespace where the operator runs | `nil` |
| `podSecurityContext` | Cluster Operator pod's security context | `nil` |
| `priorityClassName` | Cluster Operator pod's priority class name | `nil` |
| `securityContext` | Cluster Operator container's security context | `nil` |
| `rbac.create` | Whether to create RBAC related resources | `yes` |
| `serviceAccountCreate` | Whether to create a service account | `yes` |
| `serviceAccount` | Cluster Operator's service account | `strimzi-cluster-operator` |
| `podDisruptionBudget.enabled` | Whether to enable the podDisruptionBudget feature | `false` |
| `podDisruptionBudget.minAvailable` | Default value for how many pods must be running in a cluster | `1` |
| `podDisruptionBudget.maxUnavailable` | Default value for how many pods can be down | `nil` |
| `extraEnvs` | Extra environment variables for the Cluster operator container | `[]` |
| `kafka.image.registry` | Override default Kafka image registry | `nil` |
| `kafka.image.repository` | Override default Kafka image repository | `nil` |
| `kafka.image.name` | Kafka image name | `kafka` |
| `kafka.image.tagPrefix` | Override default Kafka image tag prefix | `nil` |
| `kafka.image.tag` | Override default Kafka image tag and ignore suffix | `nil` |
| `kafka.image.digest` | Override Kafka image tag with digest | `nil` |
| `kafkaConnect.image.registry` | Override default Kafka Connect image registry | `nil` |
| `kafkaConnect.image.repository` | Override default Kafka Connect image repository | `nil` |
| `kafkaConnect.image.name` | Kafka Connect image name | `kafka` |
| `kafkaConnect.image.tagPrefix` | Override default Kafka Connect image tag prefix | `nil` |
| `kafkaConnect.image.tag` | Override default Kafka Connect image tag and ignore suffix | `nil` |
| `kafkaConnect.image.digest` | Override Kafka Connect image tag with digest | `nil` |
| `kafkaMirrorMaker.image.registry` | Override default Kafka Mirror Maker image registry | `nil` |
| `kafkaMirrorMaker.image.repository` | Override default Kafka Mirror Maker image repository | `nil` |
| `kafkaMirrorMaker.image.name` | Kafka Mirror Maker image name | `kafka` |
| `kafkaMirrorMaker.image.tagPrefix` | Override default Kafka Mirror Maker image tag prefix | `nil` |
| `kafkaMirrorMaker.image.tag` | Override default Kafka Mirror Maker image tag and ignore suffix | `nil` |
| `kafkaMirrorMaker.image.digest` | Override Kafka Mirror Maker image tag with digest | `nil` |
| `cruiseControl.image.registry` | Override default Cruise Control image registry | `nil` |
| `cruiseControl.image.repository` | Override default Cruise Control image repository | `nil` |
| `cruiseControl.image.name` | Cruise Control image name | `kafka` |
| `cruiseControl.image.tagPrefix` | Override default Cruise Control image tag prefix | `nil` |
| `cruiseControl.image.tag` | Override default Cruise Control image tag and ignore suffix | `nil` |
| `cruiseControl.image.digest` | Override Cruise Control image tag with digest | `nil` |
| `topicOperator.image.registry` | Override default Topic Operator image registry | `nil` |
| `topicOperator.image.repository` | Override default Topic Operator image repository | `nil` |
| `topicOperator.image.name` | Topic Operator image name | `operator` |
| `topicOperator.image.tag` | Override default Topic Operator image tag | `nil` |
| `topicOperator.image.digest` | Override Topic Operator image tag with digest | `nil` |
| `userOperator.image.registry` | Override default User Operator image registry | `nil` |
| `userOperator.image.repository` | Override default User Operator image repository | `nil` |
| `userOperator.image.name` | User Operator image name | `operator` |
| `userOperator.image.tag` | Override default User Operator image tag | `nil` |
| `userOperator.image.digest` | Override User Operator image tag with digest | `nil` |
| `kafkaInit.image.registry` | Override default Init Kafka image registry | `nil` |
| `kafkaInit.image.repository` | Override default Init Kafka image repository | `nil` |
| `kafkaInit.image.name` | Init Kafka image name | `operator` |
| `kafkaInit.image.tag` | Override default Init Kafka image tag | `nil` |
| `kafkaInit.image.digest` | Override Init Kafka image tag with digest | `nil` |
| `tlsSidecarEntityOperator.image.registry` | Override default TLS Sidecar Entity Operator image registry | `nil` |
| `tlsSidecarEntityOperator.image.repository` | Override default TLS Sidecar Entity Operator image repository | `nil` |
| `tlsSidecarEntityOperator.image.name` | TLS Sidecar Entity Operator image name | `kafka` |
| `tlsSidecarEntityOperator.image.tagPrefix` | Override default TLS Sidecar Entity Operator image tag prefix | `nil` |
| `tlsSidecarEntityOperator.image.tag` | Override default TLS Sidecar Entity Operator image tag and ignore suffix | `nil` |
| `tlsSidecarEntityOperator.image.digest` | Override TLS Sidecar Entity Operator image tag with digest | `nil` |
| `kafkaBridge.image.registry` | Override default Kafka Bridge image registry | `quay.io` |
| `kafkaBridge.image.repository` | Override default Kafka Bridge image repository | `strimzi` |
| `kafkaBridge.image.name` | Kafka Bridge image name | `kafka-bridge` |
| `kafkaBridge.image.tag` | Override default Kafka Bridge image tag | `0.28.0` |
| `kafkaBridge.image.digest` | Override Kafka Bridge image tag with digest | `nil` |
| `kafkaExporter.image.registry` | Override default Kafka Exporter image registry | `nil` |
| `kafkaExporter.image.repository` | Override default Kafka Exporter image repository | `nil` |
| `kafkaExporter.image.name` | Kafka Exporter image name | `kafka` |
| `kafkaExporter.image.tagPrefix` | Override default Kafka Exporter image tag prefix | `nil` |
| `kafkaExporter.image.tag` | Override default Kafka Exporter image tag and ignore suffix | `nil` |
| `kafkaExporter.image.digest` | Override Kafka Exporter image tag with digest | `nil` |
| `kafkaMirrorMaker2.image.registry` | Override default Kafka Mirror Maker 2 image registry | `nil` |
| `kafkaMirrorMaker2.image.repository` | Override default Kafka Mirror Maker 2 image repository | `nil` |
| `kafkaMirrorMaker2.image.name` | Kafka Mirror Maker 2 image name | `kafka` |
| `kafkaMirrorMaker2.image.tagPrefix` | Override default Kafka Mirror Maker 2 image tag prefix | `nil` |
| `kafkaMirrorMaker2.image.tag` | Override default Kafka Mirror Maker 2 image tag and ignore suffix | `nil` |
| `kafkaMirrorMaker2.image.digest` | Override Kafka Mirror Maker 2 image tag with digest | `nil` |
| `kanikoExecutor.image.registry` | Override default Kaniko Executor image registry | `nil` |
| `kanikoExecutor.image.repository` | Override default Kaniko Executor image repository | `nil` |
| `kanikoExecutor.image.name` | Kaniko Executor image name | `kaniko-executor` |
| `kanikoExecutor.image.tag` | Override default Kaniko Executor image tag | `nil` |
| `kanikoExecutor.image.digest` | Override Kaniko Executor image tag with digest | `nil` |
| `resources.limits.memory` | Memory constraint for limits | `256Mi` |
| `resources.limits.cpu` | CPU constraint for limits | `1000m` |
| `resources.requests.memory` | Memory constraint for requests | `256Mi` |
| `livenessProbe.initialDelaySeconds` | Liveness probe initial delay in seconds | 10 |
| `livenessProbe.periodSeconds` | Liveness probe period in seconds | 30 |
| `readinessProbe.initialDelaySeconds` | Readiness probe initial delay in seconds | 10 |
| `readinessProbe.periodSeconds` | Readiness probe period in seconds | 30 |
| `imageTagOverride` | Override all image tag config | `nil` |
| `createGlobalResources` | Allow creation of cluster-scoped resources | `true` |
| `createAggregateRoles` | Create cluster roles that extend aggregated roles to use Strimzi CRDs | `false` |
| `tolerations` | Add tolerations to Operator Pod | `[]` |
| `affinity` | Add affinities to Operator Pod | `{}` |
| `annotations` | Add annotations to Operator Pod | `{}` |
| `labels` | Add labels to Operator Pod | `{}` |
| `nodeSelector` | Add a node selector to Operator Pod | `{}` |
| `featureGates` | Feature Gates configuration | `nil` |
| `tmpDirSizeLimit` | Set the `sizeLimit` for the tmp dir volume used by the operator | `1Mi` |
| `labelsExclusionPattern` | Override the exclude pattern for exclude some labels | `""` |
| `generateNetworkPolicy` | Controls whether Strimzi generates network policy resources | `true` |
| `connectBuildTimeoutMs` | Overrides the default timeout value for building new Kafka Connect | `300000` |
| `mavenBuilder.image.registry` | Override default Maven Builder image registry | `nil` |
| `mavenBuilder.image.repository` | Maven Builder image repository | `nil` |
| `mavenBuilder.image.name` | Override default Maven Builder image name | `maven-builder` |
| `mavenBuilder.image.tag` | Override default Maven Builder image tag | `nil` |
| `mavenBuilder.image.digest` | Override Maven Builder image tag with digest | `nil` |
| `logConfiguration` | Override default `log4j.properties` content | `nil` |
| `dashboards.enable` | Generate configmaps containing the dashboards | `false` |
| `dashboards.label` | How should the dashboards be labeled for the sidecar | `grafana_dashboard` |
| `dashboards.labelValue` | What should the dashboards label value be for the sidecar | `"1"` |
| `dashboards.extraLabels` | Any additional labels you would like on the dashboards | `{}` |
| `dashboards.namespace` | What namespace should the dashboards be loaded into | `Follows toplevel Namespace` |
| `dashboards.annotations` | Any custom annotations (such as folder for the sidecar) | `{}` |
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
```bash
$ helm install my-strimzi-cluster-operator --set replicas=2 oci://quay.io/strimzi-helm/strimzi-kafka-operator
```

View File

@@ -0,0 +1,128 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: strimzipodsets.core.strimzi.io
labels:
app: strimzi
strimzi.io/crd-install: "true"
component: stirmzipodsets.core.strimzi.io-crd
spec:
group: core.strimzi.io
names:
kind: StrimziPodSet
listKind: StrimziPodSetList
singular: strimzipodset
plural: strimzipodsets
shortNames:
- sps
categories:
- strimzi
scope: Namespaced
conversion:
strategy: None
versions:
- name: v1beta2
served: true
storage: true
subresources:
status: {}
additionalPrinterColumns:
- name: Pods
description: Number of pods managed by the StrimziPodSet
jsonPath: .status.pods
type: integer
- name: Ready Pods
description: Number of ready pods managed by the StrimziPodSet
jsonPath: .status.readyPods
type: integer
- name: Current Pods
description: Number of up-to-date pods managed by the StrimziPodSet
jsonPath: .status.currentPods
type: integer
- name: Age
description: Age of the StrimziPodSet
jsonPath: .metadata.creationTimestamp
type: date
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
selector:
type: object
properties:
matchExpressions:
type: array
items:
type: object
properties:
key:
type: string
operator:
type: string
values:
type: array
items:
type: string
matchLabels:
additionalProperties:
type: string
type: object
description: "Selector is a label query which matches all the pods managed by this `StrimziPodSet`. Only `matchLabels` is supported. If `matchExpressions` is set, it will be ignored."
pods:
type: array
items:
x-kubernetes-preserve-unknown-fields: true
type: object
description: The Pods managed by this StrimziPodSet.
required:
- selector
- pods
description: The specification of the StrimziPodSet.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
pods:
type: integer
description: Number of pods managed by this `StrimziPodSet` resource.
readyPods:
type: integer
description: Number of pods managed by this `StrimziPodSet` resource that are ready.
currentPods:
type: integer
description: Number of pods managed by this `StrimziPodSet` resource that have the current revision.
description: The status of the StrimziPodSet.

View File

@@ -0,0 +1,287 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: kafkatopics.kafka.strimzi.io
labels:
app: strimzi
strimzi.io/crd-install: "true"
component: kafkatopics.kafka.strimzi.io-crd
spec:
group: kafka.strimzi.io
names:
kind: KafkaTopic
listKind: KafkaTopicList
singular: kafkatopic
plural: kafkatopics
shortNames:
- kt
categories:
- strimzi
scope: Namespaced
conversion:
strategy: None
versions:
- name: v1beta2
served: true
storage: true
subresources:
status: {}
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka cluster this topic belongs to
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: Partitions
description: The desired number of partitions in the topic
jsonPath: .spec.partitions
type: integer
- name: Replication factor
description: The desired number of replicas of each partition
jsonPath: .spec.replicas
type: integer
- name: Ready
description: The state of the custom resource
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
partitions:
type: integer
minimum: 1
description: "The number of partitions the topic should have. This cannot be decreased after topic creation. It can be increased after topic creation, but it is important to understand the consequences that has, especially for topics with semantic partitioning. When absent this will default to the broker configuration for `num.partitions`."
replicas:
type: integer
minimum: 1
maximum: 32767
description: The number of replicas the topic should have. When absent this will default to the broker configuration for `default.replication.factor`.
config:
x-kubernetes-preserve-unknown-fields: true
type: object
description: The topic configuration.
topicName:
type: string
description: The name of the topic. When absent this will default to the metadata.name of the topic. It is recommended to not set this unless the topic name is not a valid Kubernetes resource name.
description: The specification of the topic.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
topicName:
type: string
description: Topic name.
topicId:
type: string
description: "The topic's id. For a KafkaTopic with the ready condition, this will change only if the topic gets deleted and recreated with the same name."
description: The status of the topic.
- name: v1beta1
served: true
storage: false
subresources:
status: {}
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka cluster this topic belongs to
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: Partitions
description: The desired number of partitions in the topic
jsonPath: .spec.partitions
type: integer
- name: Replication factor
description: The desired number of replicas of each partition
jsonPath: .spec.replicas
type: integer
- name: Ready
description: The state of the custom resource
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
partitions:
type: integer
minimum: 1
description: "The number of partitions the topic should have. This cannot be decreased after topic creation. It can be increased after topic creation, but it is important to understand the consequences that has, especially for topics with semantic partitioning. When absent this will default to the broker configuration for `num.partitions`."
replicas:
type: integer
minimum: 1
maximum: 32767
description: The number of replicas the topic should have. When absent this will default to the broker configuration for `default.replication.factor`.
config:
x-kubernetes-preserve-unknown-fields: true
type: object
description: The topic configuration.
topicName:
type: string
description: The name of the topic. When absent this will default to the metadata.name of the topic. It is recommended to not set this unless the topic name is not a valid Kubernetes resource name.
description: The specification of the topic.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
topicName:
type: string
description: Topic name.
topicId:
type: string
description: "The topic's id. For a KafkaTopic with the ready condition, this will change only if the topic gets deleted and recreated with the same name."
description: The status of the topic.
- name: v1alpha1
served: true
storage: false
subresources:
status: {}
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka cluster this topic belongs to
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: Partitions
description: The desired number of partitions in the topic
jsonPath: .spec.partitions
type: integer
- name: Replication factor
description: The desired number of replicas of each partition
jsonPath: .spec.replicas
type: integer
- name: Ready
description: The state of the custom resource
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
partitions:
type: integer
minimum: 1
description: "The number of partitions the topic should have. This cannot be decreased after topic creation. It can be increased after topic creation, but it is important to understand the consequences that has, especially for topics with semantic partitioning. When absent this will default to the broker configuration for `num.partitions`."
replicas:
type: integer
minimum: 1
maximum: 32767
description: The number of replicas the topic should have. When absent this will default to the broker configuration for `default.replication.factor`.
config:
x-kubernetes-preserve-unknown-fields: true
type: object
description: The topic configuration.
topicName:
type: string
description: The name of the topic. When absent this will default to the metadata.name of the topic. It is recommended to not set this unless the topic name is not a valid Kubernetes resource name.
description: The specification of the topic.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
topicName:
type: string
description: Topic name.
topicId:
type: string
description: "The topic's id. For a KafkaTopic with the ready condition, this will change only if the topic gets deleted and recreated with the same name."
description: The status of the topic.

View File

@@ -0,0 +1,716 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: kafkausers.kafka.strimzi.io
labels:
app: strimzi
strimzi.io/crd-install: "true"
component: kafkausers.kafka.strimzi.io-crd
spec:
group: kafka.strimzi.io
names:
kind: KafkaUser
listKind: KafkaUserList
singular: kafkauser
plural: kafkausers
shortNames:
- ku
categories:
- strimzi
scope: Namespaced
conversion:
strategy: None
versions:
- name: v1beta2
served: true
storage: true
subresources:
status: {}
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka cluster this user belongs to
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: Authentication
description: How the user is authenticated
jsonPath: .spec.authentication.type
type: string
- name: Authorization
description: How the user is authorised
jsonPath: .spec.authorization.type
type: string
- name: Ready
description: The state of the custom resource
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
authentication:
type: object
properties:
password:
type: object
properties:
valueFrom:
type: object
properties:
secretKeyRef:
type: object
properties:
key:
type: string
name:
type: string
optional:
type: boolean
description: Selects a key of a Secret in the resource's namespace.
description: Secret from which the password should be read.
required:
- valueFrom
description: "Specify the password for the user. If not set, a new password is generated by the User Operator."
type:
type: string
enum:
- tls
- tls-external
- scram-sha-512
description: Authentication type.
required:
- type
description: "Authentication mechanism enabled for this Kafka user. The supported authentication mechanisms are `scram-sha-512`, `tls`, and `tls-external`. \n\n* `scram-sha-512` generates a secret with SASL SCRAM-SHA-512 credentials.\n* `tls` generates a secret with user certificate for mutual TLS authentication.\n* `tls-external` does not generate a user certificate. But prepares the user for using mutual TLS authentication using a user certificate generated outside the User Operator.\n ACLs and quotas set for this user are configured in the `CN=<username>` format.\n\nAuthentication is optional. If authentication is not configured, no credentials are generated. ACLs and quotas set for the user are configured in the `<username>` format suitable for SASL authentication."
authorization:
type: object
properties:
acls:
type: array
items:
type: object
properties:
host:
type: string
description: The host from which the action described in the ACL rule is allowed or denied.
operation:
type: string
enum:
- Read
- Write
- Create
- Delete
- Alter
- Describe
- ClusterAction
- AlterConfigs
- DescribeConfigs
- IdempotentWrite
- All
description: "Operation which will be allowed or denied. Supported operations are: Read, Write, Create, Delete, Alter, Describe, ClusterAction, AlterConfigs, DescribeConfigs, IdempotentWrite and All."
operations:
type: array
items:
type: string
enum:
- Read
- Write
- Create
- Delete
- Alter
- Describe
- ClusterAction
- AlterConfigs
- DescribeConfigs
- IdempotentWrite
- All
description: "List of operations which will be allowed or denied. Supported operations are: Read, Write, Create, Delete, Alter, Describe, ClusterAction, AlterConfigs, DescribeConfigs, IdempotentWrite and All."
resource:
type: object
properties:
name:
type: string
description: Name of resource for which given ACL rule applies. Can be combined with `patternType` field to use prefix pattern.
patternType:
type: string
enum:
- literal
- prefix
description: "Describes the pattern used in the resource field. The supported types are `literal` and `prefix`. With `literal` pattern type, the resource field will be used as a definition of a full name. With `prefix` pattern type, the resource name will be used only as a prefix. Default value is `literal`."
type:
type: string
enum:
- topic
- group
- cluster
- transactionalId
description: "Resource type. The available resource types are `topic`, `group`, `cluster`, and `transactionalId`."
required:
- type
description: Indicates the resource for which given ACL rule applies.
type:
type: string
enum:
- allow
- deny
description: The type of the rule. Currently the only supported type is `allow`. ACL rules with type `allow` are used to allow user to execute the specified operations. Default value is `allow`.
required:
- resource
description: List of ACL rules which should be applied to this user.
type:
type: string
enum:
- simple
description: Authorization type. Currently the only supported type is `simple`. `simple` authorization type uses the Kafka Admin API for managing the ACL rules.
required:
- acls
- type
description: Authorization rules for this Kafka user.
quotas:
type: object
properties:
consumerByteRate:
type: integer
minimum: 0
description: A quota on the maximum bytes per-second that each client group can fetch from a broker before the clients in the group are throttled. Defined on a per-broker basis.
controllerMutationRate:
type: number
minimum: 0
description: "A quota on the rate at which mutations are accepted for the create topics request, the create partitions request and the delete topics request. The rate is accumulated by the number of partitions created or deleted."
producerByteRate:
type: integer
minimum: 0
description: A quota on the maximum bytes per-second that each client group can publish to a broker before the clients in the group are throttled. Defined on a per-broker basis.
requestPercentage:
type: integer
minimum: 0
description: A quota on the maximum CPU utilization of each client group as a percentage of network and I/O threads.
description: Quotas on requests to control the broker resources used by clients. Network bandwidth and request rate quotas can be enforced.Kafka documentation for Kafka User quotas can be found at http://kafka.apache.org/documentation/#design_quotas.
template:
type: object
properties:
secret:
type: object
properties:
metadata:
type: object
properties:
labels:
additionalProperties:
type: string
type: object
description: Labels added to the Kubernetes resource.
annotations:
additionalProperties:
type: string
type: object
description: Annotations added to the Kubernetes resource.
description: Metadata applied to the resource.
description: Template for KafkaUser resources. The template allows users to specify how the `Secret` with password or TLS certificates is generated.
description: Template to specify how Kafka User `Secrets` are generated.
description: The specification of the user.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
username:
type: string
description: Username.
secret:
type: string
description: The name of `Secret` where the credentials are stored.
description: The status of the Kafka User.
- name: v1beta1
served: true
storage: false
subresources:
status: {}
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka cluster this user belongs to
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: Authentication
description: How the user is authenticated
jsonPath: .spec.authentication.type
type: string
- name: Authorization
description: How the user is authorised
jsonPath: .spec.authorization.type
type: string
- name: Ready
description: The state of the custom resource
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
authentication:
type: object
properties:
password:
type: object
properties:
valueFrom:
type: object
properties:
secretKeyRef:
type: object
properties:
key:
type: string
name:
type: string
optional:
type: boolean
description: Selects a key of a Secret in the resource's namespace.
description: Secret from which the password should be read.
required:
- valueFrom
description: "Specify the password for the user. If not set, a new password is generated by the User Operator."
type:
type: string
enum:
- tls
- tls-external
- scram-sha-512
description: Authentication type.
required:
- type
description: "Authentication mechanism enabled for this Kafka user. The supported authentication mechanisms are `scram-sha-512`, `tls`, and `tls-external`. \n\n* `scram-sha-512` generates a secret with SASL SCRAM-SHA-512 credentials.\n* `tls` generates a secret with user certificate for mutual TLS authentication.\n* `tls-external` does not generate a user certificate. But prepares the user for using mutual TLS authentication using a user certificate generated outside the User Operator.\n ACLs and quotas set for this user are configured in the `CN=<username>` format.\n\nAuthentication is optional. If authentication is not configured, no credentials are generated. ACLs and quotas set for the user are configured in the `<username>` format suitable for SASL authentication."
authorization:
type: object
properties:
acls:
type: array
items:
type: object
properties:
host:
type: string
description: The host from which the action described in the ACL rule is allowed or denied.
operation:
type: string
enum:
- Read
- Write
- Create
- Delete
- Alter
- Describe
- ClusterAction
- AlterConfigs
- DescribeConfigs
- IdempotentWrite
- All
description: "Operation which will be allowed or denied. Supported operations are: Read, Write, Create, Delete, Alter, Describe, ClusterAction, AlterConfigs, DescribeConfigs, IdempotentWrite and All."
operations:
type: array
items:
type: string
enum:
- Read
- Write
- Create
- Delete
- Alter
- Describe
- ClusterAction
- AlterConfigs
- DescribeConfigs
- IdempotentWrite
- All
description: "List of operations which will be allowed or denied. Supported operations are: Read, Write, Create, Delete, Alter, Describe, ClusterAction, AlterConfigs, DescribeConfigs, IdempotentWrite and All."
resource:
type: object
properties:
name:
type: string
description: Name of resource for which given ACL rule applies. Can be combined with `patternType` field to use prefix pattern.
patternType:
type: string
enum:
- literal
- prefix
description: "Describes the pattern used in the resource field. The supported types are `literal` and `prefix`. With `literal` pattern type, the resource field will be used as a definition of a full name. With `prefix` pattern type, the resource name will be used only as a prefix. Default value is `literal`."
type:
type: string
enum:
- topic
- group
- cluster
- transactionalId
description: "Resource type. The available resource types are `topic`, `group`, `cluster`, and `transactionalId`."
required:
- type
description: Indicates the resource for which given ACL rule applies.
type:
type: string
enum:
- allow
- deny
description: The type of the rule. Currently the only supported type is `allow`. ACL rules with type `allow` are used to allow user to execute the specified operations. Default value is `allow`.
required:
- resource
description: List of ACL rules which should be applied to this user.
type:
type: string
enum:
- simple
description: Authorization type. Currently the only supported type is `simple`. `simple` authorization type uses the Kafka Admin API for managing the ACL rules.
required:
- acls
- type
description: Authorization rules for this Kafka user.
quotas:
type: object
properties:
consumerByteRate:
type: integer
minimum: 0
description: A quota on the maximum bytes per-second that each client group can fetch from a broker before the clients in the group are throttled. Defined on a per-broker basis.
controllerMutationRate:
type: number
minimum: 0
description: "A quota on the rate at which mutations are accepted for the create topics request, the create partitions request and the delete topics request. The rate is accumulated by the number of partitions created or deleted."
producerByteRate:
type: integer
minimum: 0
description: A quota on the maximum bytes per-second that each client group can publish to a broker before the clients in the group are throttled. Defined on a per-broker basis.
requestPercentage:
type: integer
minimum: 0
description: A quota on the maximum CPU utilization of each client group as a percentage of network and I/O threads.
description: Quotas on requests to control the broker resources used by clients. Network bandwidth and request rate quotas can be enforced.Kafka documentation for Kafka User quotas can be found at http://kafka.apache.org/documentation/#design_quotas.
template:
type: object
properties:
secret:
type: object
properties:
metadata:
type: object
properties:
labels:
additionalProperties:
type: string
type: object
description: Labels added to the Kubernetes resource.
annotations:
additionalProperties:
type: string
type: object
description: Annotations added to the Kubernetes resource.
description: Metadata applied to the resource.
description: Template for KafkaUser resources. The template allows users to specify how the `Secret` with password or TLS certificates is generated.
description: Template to specify how Kafka User `Secrets` are generated.
description: The specification of the user.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
username:
type: string
description: Username.
secret:
type: string
description: The name of `Secret` where the credentials are stored.
description: The status of the Kafka User.
- name: v1alpha1
served: true
storage: false
subresources:
status: {}
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka cluster this user belongs to
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: Authentication
description: How the user is authenticated
jsonPath: .spec.authentication.type
type: string
- name: Authorization
description: How the user is authorised
jsonPath: .spec.authorization.type
type: string
- name: Ready
description: The state of the custom resource
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
authentication:
type: object
properties:
password:
type: object
properties:
valueFrom:
type: object
properties:
secretKeyRef:
type: object
properties:
key:
type: string
name:
type: string
optional:
type: boolean
description: Selects a key of a Secret in the resource's namespace.
description: Secret from which the password should be read.
required:
- valueFrom
description: "Specify the password for the user. If not set, a new password is generated by the User Operator."
type:
type: string
enum:
- tls
- tls-external
- scram-sha-512
description: Authentication type.
required:
- type
description: "Authentication mechanism enabled for this Kafka user. The supported authentication mechanisms are `scram-sha-512`, `tls`, and `tls-external`. \n\n* `scram-sha-512` generates a secret with SASL SCRAM-SHA-512 credentials.\n* `tls` generates a secret with user certificate for mutual TLS authentication.\n* `tls-external` does not generate a user certificate. But prepares the user for using mutual TLS authentication using a user certificate generated outside the User Operator.\n ACLs and quotas set for this user are configured in the `CN=<username>` format.\n\nAuthentication is optional. If authentication is not configured, no credentials are generated. ACLs and quotas set for the user are configured in the `<username>` format suitable for SASL authentication."
authorization:
type: object
properties:
acls:
type: array
items:
type: object
properties:
host:
type: string
description: The host from which the action described in the ACL rule is allowed or denied.
operation:
type: string
enum:
- Read
- Write
- Create
- Delete
- Alter
- Describe
- ClusterAction
- AlterConfigs
- DescribeConfigs
- IdempotentWrite
- All
description: "Operation which will be allowed or denied. Supported operations are: Read, Write, Create, Delete, Alter, Describe, ClusterAction, AlterConfigs, DescribeConfigs, IdempotentWrite and All."
operations:
type: array
items:
type: string
enum:
- Read
- Write
- Create
- Delete
- Alter
- Describe
- ClusterAction
- AlterConfigs
- DescribeConfigs
- IdempotentWrite
- All
description: "List of operations which will be allowed or denied. Supported operations are: Read, Write, Create, Delete, Alter, Describe, ClusterAction, AlterConfigs, DescribeConfigs, IdempotentWrite and All."
resource:
type: object
properties:
name:
type: string
description: Name of resource for which given ACL rule applies. Can be combined with `patternType` field to use prefix pattern.
patternType:
type: string
enum:
- literal
- prefix
description: "Describes the pattern used in the resource field. The supported types are `literal` and `prefix`. With `literal` pattern type, the resource field will be used as a definition of a full name. With `prefix` pattern type, the resource name will be used only as a prefix. Default value is `literal`."
type:
type: string
enum:
- topic
- group
- cluster
- transactionalId
description: "Resource type. The available resource types are `topic`, `group`, `cluster`, and `transactionalId`."
required:
- type
description: Indicates the resource for which given ACL rule applies.
type:
type: string
enum:
- allow
- deny
description: The type of the rule. Currently the only supported type is `allow`. ACL rules with type `allow` are used to allow user to execute the specified operations. Default value is `allow`.
required:
- resource
description: List of ACL rules which should be applied to this user.
type:
type: string
enum:
- simple
description: Authorization type. Currently the only supported type is `simple`. `simple` authorization type uses the Kafka Admin API for managing the ACL rules.
required:
- acls
- type
description: Authorization rules for this Kafka user.
quotas:
type: object
properties:
consumerByteRate:
type: integer
minimum: 0
description: A quota on the maximum bytes per-second that each client group can fetch from a broker before the clients in the group are throttled. Defined on a per-broker basis.
controllerMutationRate:
type: number
minimum: 0
description: "A quota on the rate at which mutations are accepted for the create topics request, the create partitions request and the delete topics request. The rate is accumulated by the number of partitions created or deleted."
producerByteRate:
type: integer
minimum: 0
description: A quota on the maximum bytes per-second that each client group can publish to a broker before the clients in the group are throttled. Defined on a per-broker basis.
requestPercentage:
type: integer
minimum: 0
description: A quota on the maximum CPU utilization of each client group as a percentage of network and I/O threads.
description: Quotas on requests to control the broker resources used by clients. Network bandwidth and request rate quotas can be enforced.Kafka documentation for Kafka User quotas can be found at http://kafka.apache.org/documentation/#design_quotas.
template:
type: object
properties:
secret:
type: object
properties:
metadata:
type: object
properties:
labels:
additionalProperties:
type: string
type: object
description: Labels added to the Kubernetes resource.
annotations:
additionalProperties:
type: string
type: object
description: Annotations added to the Kubernetes resource.
description: Metadata applied to the resource.
description: Template for KafkaUser resources. The template allows users to specify how the `Secret` with password or TLS certificates is generated.
description: Template to specify how Kafka User `Secrets` are generated.
description: The specification of the user.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
username:
type: string
description: Username.
secret:
type: string
description: The name of `Secret` where the credentials are stored.
description: The status of the Kafka User.

View File

@@ -0,0 +1,148 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: kafkaconnectors.kafka.strimzi.io
labels:
app: strimzi
strimzi.io/crd-install: "true"
component: kafkaconnectors.kafka.strimzi.io-crd
spec:
group: kafka.strimzi.io
names:
kind: KafkaConnector
listKind: KafkaConnectorList
singular: kafkaconnector
plural: kafkaconnectors
shortNames:
- kctr
categories:
- strimzi
scope: Namespaced
conversion:
strategy: None
versions:
- name: v1beta2
served: true
storage: true
subresources:
status: {}
scale:
specReplicasPath: .spec.tasksMax
statusReplicasPath: .status.tasksMax
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka Connect cluster this connector belongs to
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: Connector class
description: The class used by this connector
jsonPath: .spec.class
type: string
- name: Max Tasks
description: Maximum number of tasks
jsonPath: .spec.tasksMax
type: integer
- name: Ready
description: The state of the custom resource
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
class:
type: string
description: The Class for the Kafka Connector.
tasksMax:
type: integer
minimum: 1
description: The maximum number of tasks for the Kafka Connector.
autoRestart:
type: object
properties:
enabled:
type: boolean
description: Whether automatic restart for failed connectors and tasks should be enabled or disabled.
maxRestarts:
type: integer
description: "The maximum number of connector restarts that the operator will try. If the connector remains in a failed state after reaching this limit, it must be restarted manually by the user. Defaults to an unlimited number of restarts."
description: Automatic restart of connector and tasks configuration.
config:
x-kubernetes-preserve-unknown-fields: true
type: object
description: "The Kafka Connector configuration. The following properties cannot be set: connector.class, tasks.max."
pause:
type: boolean
description: Whether the connector should be paused. Defaults to false.
state:
type: string
enum:
- paused
- stopped
- running
description: The state the connector should be in. Defaults to running.
description: The specification of the Kafka Connector.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
autoRestart:
type: object
properties:
count:
type: integer
description: The number of times the connector or task is restarted.
connectorName:
type: string
description: The name of the connector being restarted.
lastRestartTimestamp:
type: string
description: The last time the automatic restart was attempted. The required format is 'yyyy-MM-ddTHH:mm:ssZ' in the UTC time zone.
description: The auto restart status.
connectorStatus:
x-kubernetes-preserve-unknown-fields: true
type: object
description: "The connector status, as reported by the Kafka Connect REST API."
tasksMax:
type: integer
description: The maximum number of tasks for the Kafka Connector.
topics:
type: array
items:
type: string
description: The list of topics used by the Kafka Connector.
description: The status of the Kafka Connector.

View File

@@ -0,0 +1,151 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: kafkarebalances.kafka.strimzi.io
labels:
app: strimzi
strimzi.io/crd-install: "true"
component: kafkarebalances.kafka.strimzi.io-crd
spec:
group: kafka.strimzi.io
names:
kind: KafkaRebalance
listKind: KafkaRebalanceList
singular: kafkarebalance
plural: kafkarebalances
shortNames:
- kr
categories:
- strimzi
scope: Namespaced
conversion:
strategy: None
versions:
- name: v1beta2
served: true
storage: true
subresources:
status: {}
additionalPrinterColumns:
- name: Cluster
description: The name of the Kafka cluster this resource rebalances
jsonPath: .metadata.labels.strimzi\.io/cluster
type: string
- name: PendingProposal
description: A proposal has been requested from Cruise Control
jsonPath: ".status.conditions[?(@.type==\"PendingProposal\")].status"
type: string
- name: ProposalReady
description: A proposal is ready and waiting for approval
jsonPath: ".status.conditions[?(@.type==\"ProposalReady\")].status"
type: string
- name: Rebalancing
description: Cruise Control is doing the rebalance
jsonPath: ".status.conditions[?(@.type==\"Rebalancing\")].status"
type: string
- name: Ready
description: The rebalance is complete
jsonPath: ".status.conditions[?(@.type==\"Ready\")].status"
type: string
- name: NotReady
description: There is an error on the custom resource
jsonPath: ".status.conditions[?(@.type==\"NotReady\")].status"
type: string
schema:
openAPIV3Schema:
type: object
properties:
apiVersion:
type: string
description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources"
kind:
type: string
description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"
metadata:
type: object
spec:
type: object
properties:
mode:
type: string
enum:
- full
- add-brokers
- remove-brokers
description: "Mode to run the rebalancing. The supported modes are `full`, `add-brokers`, `remove-brokers`.\nIf not specified, the `full` mode is used by default. \n\n* `full` mode runs the rebalancing across all the brokers in the cluster.\n* `add-brokers` mode can be used after scaling up the cluster to move some replicas to the newly added brokers.\n* `remove-brokers` mode can be used before scaling down the cluster to move replicas out of the brokers to be removed.\n"
brokers:
type: array
items:
type: integer
description: The list of newly added brokers in case of scaling up or the ones to be removed in case of scaling down to use for rebalancing. This list can be used only with rebalancing mode `add-brokers` and `removed-brokers`. It is ignored with `full` mode.
goals:
type: array
items:
type: string
description: "A list of goals, ordered by decreasing priority, to use for generating and executing the rebalance proposal. The supported goals are available at https://github.com/linkedin/cruise-control#goals. If an empty goals list is provided, the goals declared in the default.goals Cruise Control configuration parameter are used."
skipHardGoalCheck:
type: boolean
description: Whether to allow the hard goals specified in the Kafka CR to be skipped in optimization proposal generation. This can be useful when some of those hard goals are preventing a balance solution being found. Default is false.
rebalanceDisk:
type: boolean
description: "Enables intra-broker disk balancing, which balances disk space utilization between disks on the same broker. Only applies to Kafka deployments that use JBOD storage with multiple disks. When enabled, inter-broker balancing is disabled. Default is false."
excludedTopics:
type: string
description: A regular expression where any matching topics will be excluded from the calculation of optimization proposals. This expression will be parsed by the java.util.regex.Pattern class; for more information on the supported format consult the documentation for that class.
concurrentPartitionMovementsPerBroker:
type: integer
minimum: 0
description: The upper bound of ongoing partition replica movements going into/out of each broker. Default is 5.
concurrentIntraBrokerPartitionMovements:
type: integer
minimum: 0
description: The upper bound of ongoing partition replica movements between disks within each broker. Default is 2.
concurrentLeaderMovements:
type: integer
minimum: 0
description: The upper bound of ongoing partition leadership movements. Default is 1000.
replicationThrottle:
type: integer
minimum: 0
description: "The upper bound, in bytes per second, on the bandwidth used to move replicas. There is no limit by default."
replicaMovementStrategies:
type: array
items:
type: string
description: "A list of strategy class names used to determine the execution order for the replica movements in the generated optimization proposal. By default BaseReplicaMovementStrategy is used, which will execute the replica movements in the order that they were generated."
description: The specification of the Kafka rebalance.
status:
type: object
properties:
conditions:
type: array
items:
type: object
properties:
type:
type: string
description: "The unique identifier of a condition, used to distinguish between other conditions in the resource."
status:
type: string
description: "The status of the condition, either True, False or Unknown."
lastTransitionTime:
type: string
description: "Last time the condition of a type changed from one status to another. The required format is 'yyyy-MM-ddTHH:mm:ssZ', in the UTC time zone."
reason:
type: string
description: The reason for the condition's last transition (a single word in CamelCase).
message:
type: string
description: Human-readable message indicating details about the condition's last transition.
description: List of status conditions.
observedGeneration:
type: integer
description: The generation of the CRD that was last reconciled by the operator.
sessionId:
type: string
description: The session identifier for requests to Cruise Control pertaining to this KafkaRebalance resource. This is used by the Kafka Rebalance operator to track the status of ongoing rebalancing operations.
optimizationResult:
x-kubernetes-preserve-unknown-fields: true
type: object
description: A JSON object describing the optimization result.
description: The status of the Kafka rebalance.

View File

@@ -0,0 +1,827 @@
{
"__requires": [
{
"type": "grafana",
"id": "grafana",
"name": "Grafana",
"version": "7.3.7"
},
{
"type": "panel",
"id": "graph",
"name": "Graph",
"version": "5.0.0"
},
{
"type": "datasource",
"id": "prometheus",
"name": "Prometheus",
"version": "5.0.0"
},
{
"type": "panel",
"id": "singlestat",
"name": "Singlestat",
"version": "5.0.0"
}
],
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": "-- Grafana --",
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"type": "dashboard"
}
]
},
"editable": true,
"gnetId": null,
"graphTooltip": 0,
"iteration": 1687301303076,
"links": [],
"panels": [
{
"collapsed": false,
"datasource": null,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 68
},
"id": 118,
"panels": [],
"title": "OAuth",
"type": "row"
},
{
"aliasColors": {},
"bars": true,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"description": "",
"fieldConfig": {
"defaults": {
"custom": {},
"unit": "none"
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 69
},
"hiddenSeries": false,
"id": 109,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": false,
"linewidth": 1,
"links": [],
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"paceLength": 10,
"percentage": false,
"pluginVersion": "7.3.7",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": true,
"steppedLine": false,
"targets": [
{
"exemplar": true,
"expr": "irate(strimzi_oauth_http_requests_count{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}[$__rate_interval]) * 30",
"format": "time_series",
"instant": false,
"interval": "60s",
"intervalFactor": 1,
"legendFormat": "[{{context}}] {{host}} (Status: {{status}})",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "OAuth HTTP Request Count",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:113",
"decimals": 0,
"format": "none",
"label": "",
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"$$hashKey": "object:114",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": true,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"description": "",
"fieldConfig": {
"defaults": {
"custom": {},
"unit": "none"
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 69
},
"hiddenSeries": false,
"id": 112,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": false,
"linewidth": 1,
"links": [],
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"paceLength": 10,
"percentage": false,
"pluginVersion": "7.3.7",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": true,
"steppedLine": false,
"targets": [
{
"exemplar": true,
"expr": "irate(strimzi_oauth_validation_requests_count{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}[$__rate_interval]) * 30",
"format": "time_series",
"instant": false,
"interval": "60s",
"intervalFactor": 1,
"legendFormat": "[{{context}}] {{host}} ({{outcome}})",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "OAuth Validation Request Count",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:113",
"decimals": 0,
"format": "none",
"label": "",
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"$$hashKey": "object:114",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": "auto",
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"description": "",
"fieldConfig": {
"defaults": {
"custom": {},
"unit": "none"
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 77
},
"hiddenSeries": false,
"id": 110,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"links": [],
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"paceLength": 10,
"percentage": false,
"pluginVersion": "7.3.7",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": true,
"steppedLine": true,
"targets": [
{
"exemplar": true,
"expr": "strimzi_oauth_http_requests_count{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}",
"format": "time_series",
"instant": false,
"interval": "60s",
"intervalFactor": 1,
"legendFormat": "[{{context}}] {{host}} (Status: {{status}})",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "OAuth HTTP Total Request Count",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:113",
"decimals": 0,
"format": "none",
"label": "",
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"$$hashKey": "object:114",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": false,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"description": "",
"fieldConfig": {
"defaults": {
"custom": {},
"unit": "none"
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 77
},
"hiddenSeries": false,
"id": 111,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": true,
"linewidth": 1,
"links": [],
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"paceLength": 10,
"percentage": false,
"pluginVersion": "7.3.7",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": true,
"steppedLine": true,
"targets": [
{
"exemplar": true,
"expr": "strimzi_oauth_validation_requests_count{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}",
"format": "time_series",
"instant": false,
"interval": "60s",
"intervalFactor": 1,
"legendFormat": "[{{context}}] {{host}} ({{outcome}})",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "OAuth Validation Total Request Count",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:113",
"decimals": 0,
"format": "none",
"label": "",
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"$$hashKey": "object:114",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": true,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"description": "",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 85
},
"hiddenSeries": false,
"id": 114,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": false,
"linewidth": 1,
"links": [],
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"paceLength": 10,
"percentage": false,
"pluginVersion": "7.3.7",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"exemplar": true,
"expr": "irate(strimzi_oauth_http_requests_totaltimems{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}[$__rate_interval]) / irate(strimzi_oauth_http_requests_count{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}[$__rate_interval])",
"format": "time_series",
"instant": false,
"interval": "60s",
"intervalFactor": 1,
"legendFormat": "[{{context}}] {{host}} (Status: {{status}})",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "OAuth HTTP Request Time (ms / req)",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:113",
"decimals": 0,
"format": "ms",
"label": "",
"logBase": 1,
"max": null,
"min": null,
"show": true
},
{
"$$hashKey": "object:114",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": null,
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
},
{
"aliasColors": {},
"bars": true,
"dashLength": 10,
"dashes": false,
"datasource": "${DS_PROMETHEUS}",
"description": "",
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"fill": 1,
"fillGradient": 0,
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 85
},
"hiddenSeries": false,
"id": 113,
"legend": {
"avg": false,
"current": false,
"max": false,
"min": false,
"show": true,
"total": false,
"values": false
},
"lines": false,
"linewidth": 1,
"links": [],
"nullPointMode": "null",
"options": {
"alertThreshold": true
},
"paceLength": 10,
"percentage": false,
"pluginVersion": "7.3.7",
"pointradius": 2,
"points": false,
"renderer": "flot",
"seriesOverrides": [],
"spaceLength": 10,
"stack": false,
"steppedLine": false,
"targets": [
{
"exemplar": true,
"expr": "irate(strimzi_oauth_validation_requests_totaltimems{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}[$__rate_interval]) / irate(strimzi_oauth_validation_requests_count{namespace=\"$kubernetes_namespace\",pod=~\"$strimzi_cluster_name-$kafka_broker\"}[$__rate_interval])\n",
"format": "time_series",
"instant": false,
"interval": "60s",
"intervalFactor": 1,
"legendFormat": "[{{context}}] {{host}} ({{outcome}})",
"refId": "A"
}
],
"thresholds": [],
"timeFrom": null,
"timeRegions": [],
"timeShift": null,
"title": "OAuth Validation Request Time (ms / req)",
"tooltip": {
"shared": true,
"sort": 0,
"value_type": "individual"
},
"type": "graph",
"xaxis": {
"buckets": null,
"mode": "time",
"name": null,
"show": true,
"values": []
},
"yaxes": [
{
"$$hashKey": "object:113",
"decimals": 0,
"format": "ms",
"label": "",
"logBase": 1,
"max": null,
"min": "0",
"show": true
},
{
"$$hashKey": "object:114",
"format": "short",
"label": null,
"logBase": 1,
"max": null,
"min": "auto",
"show": true
}
],
"yaxis": {
"align": false,
"alignLevel": null
}
}
],
"refresh": "5s",
"schemaVersion": 26,
"style": "dark",
"tags": [
"Strimzi",
"Kafka"
],
"templating": {
"list": [
{
"current": {},
"error": null,
"hide": 0,
"includeAll": false,
"label": "datasource",
"multi": false,
"name": "DS_PROMETHEUS",
"options": [],
"query": "prometheus",
"refresh": 1,
"regex": "",
"skipUrlSync": false,
"type": "datasource"
},
{
"allFormat": "glob",
"allValue": null,
"current": {},
"datasource": "${DS_PROMETHEUS}",
"definition": "",
"error": null,
"hide": 0,
"includeAll": false,
"label": "Namespace",
"multi": false,
"name": "kubernetes_namespace",
"options": [],
"query": "query_result(kafka_server_replicamanager_leadercount)",
"refresh": 1,
"regex": "/.*namespace=\"([^\"]*).*/",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
},
{
"allFormat": "glob",
"allValue": null,
"current": {},
"datasource": "${DS_PROMETHEUS}",
"definition": "",
"error": null,
"hide": 0,
"includeAll": false,
"label": "Cluster Name",
"multi": false,
"name": "strimzi_cluster_name",
"options": [],
"query": "query_result(kafka_server_replicamanager_leadercount{namespace=\"$kubernetes_namespace\"})",
"refresh": 1,
"regex": "/.*strimzi_io_cluster=\"([^\"]*).*/",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
},
{
"allFormat": "glob",
"allValue": ".*",
"current": {},
"datasource": "${DS_PROMETHEUS}",
"definition": "",
"error": null,
"hide": 0,
"includeAll": true,
"label": "Broker",
"multi": false,
"name": "kafka_broker",
"options": [],
"query": "query_result(kafka_server_replicamanager_leadercount{namespace=\"$kubernetes_namespace\",strimzi_io_cluster=\"$strimzi_cluster_name\"})",
"refresh": 1,
"regex": "/.*pod_name=\"$strimzi_cluster_name-([^\"]*).*/",
"skipUrlSync": false,
"sort": 0,
"tagValuesQuery": "",
"tags": [],
"tagsQuery": "",
"type": "query",
"useTags": false
}
]
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {
"refresh_intervals": [
"5s",
"10s",
"30s",
"1m",
"5m",
"15m",
"30m",
"1h",
"2h",
"1d"
],
"time_options": [
"5m",
"15m",
"1h",
"6h",
"12h",
"24h",
"2d",
"7d",
"30d"
]
},
"timezone": "",
"title": "Strimzi Kafka OAuth",
"uid": "aa66282eda2b42a2b9304fb2934f940f",
"version": 2
}

View File

@@ -0,0 +1,13 @@
{{- if .Values.serviceAccountCreate -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ .Values.serviceAccount }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: service-account
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
{{- end -}}

View File

@@ -0,0 +1,166 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-cluster-operator-namespaced
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
# Resources in this role are used by the operator based on an operand being deployed in some namespace. When needed, you
# can deploy the operator as a cluster-wide operator. But grant the rights listed in this role only on the namespaces
# where the operands will be deployed. That way, you can limit the access the operator has to other namespaces where it
# does not manage any clusters.
- apiGroups:
- "rbac.authorization.k8s.io"
resources:
# The cluster operator needs to access and manage rolebindings to grant Strimzi components cluster permissions
- rolebindings
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "rbac.authorization.k8s.io"
resources:
# The cluster operator needs to access and manage roles to grant the entity operator permissions
- roles
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- ""
resources:
# The cluster operator needs to access and delete pods, this is to allow it to monitor pod health and coordinate rolling updates
- pods
# The cluster operator needs to access and manage service accounts to grant Strimzi components cluster permissions
- serviceaccounts
# The cluster operator needs to access and manage config maps for Strimzi components configuration
- configmaps
# The cluster operator needs to access and manage services and endpoints to expose Strimzi components to network traffic
- services
- endpoints
# The cluster operator needs to access and manage secrets to handle credentials
- secrets
# The cluster operator needs to access and manage persistent volume claims to bind them to Strimzi components for persistent data
- persistentvolumeclaims
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "apps"
resources:
# The cluster operator needs to access and manage deployments to run deployment based Strimzi components
- deployments
# The cluster operator needs to access and manage stateful sets to run stateful sets based Strimzi components
- statefulsets
# The cluster operator needs to access replica-sets to manage Strimzi components and to determine error states
- replicasets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "apps"
resources:
# The Cluster Operator needs to scale Deployments while migrating Connect and Mirror Maker 2 clusters from Deployments to StrimziPodSets
- deployments/scale
verbs:
- get
- patch
- update
- apiGroups:
- "" # legacy core events api, used by topic operator
- "events.k8s.io" # new events api, used by cluster operator
resources:
# The cluster operator needs to be able to create events and delegate permissions to do so
- events
verbs:
- create
- apiGroups:
# Kafka Connect Build on OpenShift requirement
- build.openshift.io
resources:
- buildconfigs
- buildconfigs/instantiate
- builds
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- networking.k8s.io
resources:
# The cluster operator needs to access and manage network policies to lock down communication between Strimzi components
- networkpolicies
# The cluster operator needs to access and manage ingresses which allow external access to the services in a cluster
- ingresses
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- route.openshift.io
resources:
# The cluster operator needs to access and manage routes to expose Strimzi components for external access
- routes
- routes/custom-host
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- image.openshift.io
resources:
# The cluster operator needs to verify the image stream when used for Kafka Connect image build
- imagestreams
verbs:
- get
- apiGroups:
- policy
resources:
# The cluster operator needs to access and manage pod disruption budgets this limits the number of concurrent disruptions
# that a Strimzi component experiences, allowing for higher availability
- poddisruptionbudgets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
{{- end -}}

View File

@@ -0,0 +1,33 @@
{{- if .Values.rbac.create -}}
{{- $root := . -}}
{{- range append .Values.watchNamespaces .Release.Namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1
{{- if $root.Values.watchAnyNamespace }}
kind: ClusterRoleBinding
{{- else }}
kind: RoleBinding
{{- end }}
metadata:
{{- if $root.Values.watchAnyNamespace }}
name: strimzi-cluster-operator-namespaced
{{- else }}
name: strimzi-cluster-operator
{{- end }}
namespace: {{ . }}
labels:
app: {{ template "strimzi.name" $root }}
chart: {{ template "strimzi.chart" $root }}
component: role-binding
release: {{ $root.Release.Name }}
heritage: {{ $root.Release.Service }}
subjects:
- kind: ServiceAccount
name: {{ $root.Values.serviceAccount }}
namespace: {{ $root.Release.Namespace }}
roleRef:
kind: ClusterRole
name: strimzi-cluster-operator-namespaced
apiGroup: rbac.authorization.k8s.io
{{- end }}
{{- end }}

View File

@@ -0,0 +1,44 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-cluster-operator-global
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
- apiGroups:
- "rbac.authorization.k8s.io"
resources:
# The cluster operator needs to create and manage cluster role bindings in the case of an install where a user
# has specified they want their cluster role bindings generated
- clusterrolebindings
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- storage.k8s.io
resources:
# The cluster operator requires "get" permissions to view storage class details
# This is because only a persistent volume of a supported storage class type can be resized
- storageclasses
verbs:
- get
- apiGroups:
- ""
resources:
# The cluster operator requires "list" permissions to view all nodes in a cluster
# The listing is used to determine the node addresses when NodePort access is configured
# These addresses are then exposed in the custom resource states
- nodes
verbs:
- list
{{- end -}}

View File

@@ -0,0 +1,20 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: strimzi-cluster-operator
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: role-binding
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
subjects:
- kind: ServiceAccount
name: {{ .Values.serviceAccount }}
namespace: {{ .Release.Namespace }}
roleRef:
kind: ClusterRole
name: strimzi-cluster-operator-global
apiGroup: rbac.authorization.k8s.io
{{- end -}}

View File

@@ -0,0 +1,37 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-cluster-operator-leader-election
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
- apiGroups:
- coordination.k8s.io
resources:
# The cluster operator needs to access and manage leases for leader election
# The "create" verb cannot be used with "resourceNames"
- leases
verbs:
- create
- apiGroups:
- coordination.k8s.io
resources:
# The cluster operator needs to access and manage leases for leader election
- leases
resourceNames:
# The default RBAC files give the operator only access to the Lease resource names strimzi-cluster-operator
# If you want to use another resource name or resource namespace, you have to configure the RBAC resources accordingly
- strimzi-cluster-operator
verbs:
- get
- list
- watch
- delete
- patch
- update
{{- end -}}

View File

@@ -0,0 +1,21 @@
{{- if .Values.rbac.create }}
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: strimzi-cluster-operator-leader-election
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: role-binding
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
subjects:
- kind: ServiceAccount
name: {{ .Values.serviceAccount }}
namespace: {{ .Release.Namespace }}
roleRef:
kind: ClusterRole
name: strimzi-cluster-operator-leader-election
apiGroup: rbac.authorization.k8s.io
{{- end }}

View File

@@ -0,0 +1,82 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-cluster-operator-watched
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
# Resources in this role are being watched by the operator. When operator is deployed as cluster-wide, these permissions
# need to be granted to the operator on a cluster wide level as well, even if the operands will be deployed only in
# few of the namespaces in given cluster. This is required to set up the Kubernetes watches and informers.
# Note: The rights included in this role might change in the future
- apiGroups:
- ""
resources:
# The cluster operator needs to access and delete pods, this is to allow it to monitor pod health and coordinate rolling updates
- pods
verbs:
- watch
- list
- apiGroups:
- "kafka.strimzi.io"
resources:
# The Cluster Operator operates the Strimzi custom resources
- kafkas
- kafkanodepools
- kafkaconnects
- kafkaconnectors
- kafkamirrormakers
- kafkabridges
- kafkamirrormaker2s
- kafkarebalances
verbs:
- get
- list
- watch
- create
- patch
- update
- apiGroups:
- "kafka.strimzi.io"
resources:
# The Cluster Operator needs to manage the status of the Strimzi custom resources
- kafkas/status
- kafkanodepools/status
- kafkaconnects/status
- kafkaconnectors/status
- kafkamirrormakers/status
- kafkabridges/status
- kafkamirrormaker2s/status
- kafkarebalances/status
verbs:
- get
- patch
- update
- apiGroups:
- "core.strimzi.io"
resources:
# The cluster operator uses StrimziPodSets to manage the Kafka and ZooKeeper pods
- strimzipodsets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "core.strimzi.io"
resources:
# The Cluster Operator needs to manage the status of the StrimziPodSet custom resource
- strimzipodsets/status
verbs:
- get
- patch
- update
{{- end -}}

View File

@@ -0,0 +1,33 @@
{{- if .Values.rbac.create }}
{{- $root := . -}}
{{- range append .Values.watchNamespaces .Release.Namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1
{{- if $root.Values.watchAnyNamespace }}
kind: ClusterRoleBinding
{{- else }}
kind: RoleBinding
{{- end }}
metadata:
{{- if $root.Values.watchAnyNamespace }}
name: strimzi-cluster-operator-watched
{{- else }}
name: strimzi-cluster-operator-watched
{{- end }}
namespace: {{ . }}
labels:
app: {{ template "strimzi.name" $root }}
chart: {{ template "strimzi.chart" $root }}
component: role-binding
release: {{ $root.Release.Name }}
heritage: {{ $root.Release.Service }}
subjects:
- kind: ServiceAccount
name: {{ $root.Values.serviceAccount }}
namespace: {{ $root.Release.Namespace }}
roleRef:
kind: ClusterRole
name: strimzi-cluster-operator-watched
apiGroup: rbac.authorization.k8s.io
{{- end }}
{{- end }}

View File

@@ -0,0 +1,21 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-kafka-broker
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: broker-role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
- apiGroups:
- ""
resources:
# The Kafka Brokers require "get" permissions to view the node they are on
# This information is used to generate a Rack ID that is used for High Availability configurations
- nodes
verbs:
- get
{{- end -}}

View File

@@ -0,0 +1,23 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: strimzi-cluster-operator-kafka-broker-delegation
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: broker-role-binding
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
# The Kafka broker cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Kafka brokers.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
- kind: ServiceAccount
name: {{ .Values.serviceAccount }}
namespace: {{ .Release.Namespace }}
roleRef:
kind: ClusterRole
name: strimzi-kafka-broker
apiGroup: rbac.authorization.k8s.io
{{- end -}}

View File

@@ -0,0 +1,69 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-entity-operator
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: entity-operator-role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
- apiGroups:
- "kafka.strimzi.io"
resources:
# The Entity Operator contains the Topic Operator which needs to access and manage KafkaTopic resources
- kafkatopics
verbs:
- get
- list
- watch
- create
- patch
- update
- delete
- apiGroups:
- "kafka.strimzi.io"
resources:
# The Entity Operator contains the User Operator which needs to access and manage KafkaUser resources
- kafkausers
verbs:
- get
- list
- watch
- create
- patch
- update
- apiGroups:
- "kafka.strimzi.io"
resources:
# The Entity Operator contains the Topic Operator which needs to access and manage KafkaTopic resources
- kafkatopics/status
# The Entity Operator contains the User Operator which needs to access and manage KafkaUser resources
- kafkausers/status
verbs:
- get
- patch
- update
- apiGroups:
- ""
resources:
- events
verbs:
# The entity operator needs to be able to create events
- create
- apiGroups:
- ""
resources:
# The entity operator user-operator needs to access and manage secrets to store generated credentials
- secrets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
{{- end -}}

View File

@@ -0,0 +1,31 @@
{{- if .Values.rbac.create }}
{{- $root := . -}}
{{- range append .Values.watchNamespaces .Release.Namespace }}
---
apiVersion: rbac.authorization.k8s.io/v1
{{- if $root.Values.watchAnyNamespace }}
kind: ClusterRoleBinding
{{- else }}
kind: RoleBinding
{{- end }}
metadata:
name: strimzi-cluster-operator-entity-operator-delegation
namespace: {{ . }}
labels:
app: {{ template "strimzi.name" $root }}
chart: {{ template "strimzi.chart" $root }}
component: entity-operator-role-binding
release: {{ $root.Release.Name }}
heritage: {{ $root.Release.Service }}
# The Entity Operator cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Entity Operator.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
- kind: ServiceAccount
name: {{ $root.Values.serviceAccount }}
namespace: {{ $root.Release.Namespace }}
roleRef:
kind: ClusterRole
name: strimzi-entity-operator
apiGroup: rbac.authorization.k8s.io
{{- end }}
{{- end }}

View File

@@ -0,0 +1,22 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-kafka-client
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: client-role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
rules:
- apiGroups:
- ""
resources:
# The Kafka clients (Connect, Mirror Maker, etc.) require "get" permissions to view the node they are on
# This information is used to generate a Rack ID (client.rack option) that is used for consuming from the closest
# replicas when enabled
- nodes
verbs:
- get
{{- end -}}

View File

@@ -0,0 +1,24 @@
{{- if and .Values.rbac.create .Values.createGlobalResources -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: strimzi-cluster-operator-kafka-client-delegation
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: client-role-binding
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
# The Kafka clients cluster role must be bound to the cluster operator service account so that it can delegate the
# cluster role to the Kafka clients using it for consuming from closest replica.
# This must be done to avoid escalating privileges which would be blocked by Kubernetes.
subjects:
- kind: ServiceAccount
name: {{ .Values.serviceAccount }}
namespace: {{ .Release.Namespace }}
roleRef:
kind: ClusterRole
name: strimzi-kafka-client
apiGroup: rbac.authorization.k8s.io
{{- end -}}

View File

@@ -0,0 +1,40 @@
kind: ConfigMap
apiVersion: v1
metadata:
name: {{ .Values.logConfigMap }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: logging-config-map
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
data:
log4j2.properties: |
{{- if .Values.logConfiguration }}
{{- tpl .Values.logConfiguration . | nindent 4 }}
{{- else }}
name = COConfig
monitorInterval = 30
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
rootLogger.level = {{ default .Values.logLevel .Values.logLevelOverride }}
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.console.ref = STDOUT
# Kafka AdminClient logging is a bit noisy at INFO level
logger.kafka.name = org.apache.kafka
logger.kafka.level = WARN
# Zookeeper is very verbose even on INFO level -> We set it to WARN by default
logger.zookeepertrustmanager.name = org.apache.zookeeper
logger.zookeepertrustmanager.level = WARN
# Keeps separate level for Netty logging -> to not be changed by the root logger
logger.netty.name = io.netty
logger.netty.level = INFO
{{- end }}

View File

@@ -0,0 +1,16 @@
{{- if .Values.podDisruptionBudget.enabled -}}
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: strimzi-cluster-operator-pdb
spec:
selector:
matchLabels:
name: strimzi-cluster-operator
{{- if .Values.podDisruptionBudget.minAvailable }}
minAvailable: {{ .Values.podDisruptionBudget.minAvailable }}
{{- end }}
{{- if .Values.podDisruptionBudget.maxUnavailable }}
maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,187 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: strimzi-cluster-operator
namespace: {{ .Release.Namespace }}
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: deployment
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
name: strimzi-cluster-operator
strimzi.io/kind: cluster-operator
template:
metadata:
labels:
name: strimzi-cluster-operator
strimzi.io/kind: cluster-operator
{{- with .Values.labels }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.annotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
serviceAccountName: {{ .Values.serviceAccount }}
{{- /* imagePullSecrets is allowed to be for backwards compatibility */ -}}
{{- if kindIs "string" .Values.image.imagePullSecrets }}
imagePullSecrets:
- name: {{ .Values.image.imagePullSecrets }}
{{- else if kindIs "slice" .Values.image.imagePullSecrets }}
imagePullSecrets:
{{- with .Values.image.imagePullSecrets }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- end }}
{{- with .Values.podSecurityContext }}
securityContext: {{ toYaml . | nindent 8 }}
{{- end }}
{{- if .Values.priorityClassName }}
priorityClassName: {{ .Values.priorityClassName }}
{{- end }}
volumes:
- name: strimzi-tmp
emptyDir:
medium: Memory
sizeLimit: {{ .Values.tmpDirSizeLimit }}
- name: {{ .Values.logVolume }}
configMap:
name: {{ .Values.logConfigMap }}
containers:
- name: strimzi-cluster-operator
image: {{ template "strimzi.image" (set . "key" "") }}
ports:
- containerPort: 8080
name: http
{{- if .Values.image.imagePullPolicy }}
imagePullPolicy: {{ .Values.image.imagePullPolicy | quote }}
{{- end }}
args:
- /opt/strimzi/bin/cluster_operator_run.sh
volumeMounts:
- name: strimzi-tmp
mountPath: /tmp
- name: {{ .Values.logVolume }}
mountPath: /opt/strimzi/custom-config/
env:
- name: STRIMZI_NAMESPACE
{{- if .Values.watchAnyNamespace }}
value: "*"
{{- else }}
{{- if .Values.watchNamespaces -}}
{{- $ns := .Values.watchNamespaces -}}
{{- $ns := append $ns .Release.Namespace }}
value: "{{ join "," $ns }}"
{{- else }}
valueFrom:
fieldRef:
fieldPath: metadata.namespace
{{- end }}
{{- end }}
- name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
value: {{ .Values.fullReconciliationIntervalMs | quote }}
- name: STRIMZI_OPERATION_TIMEOUT_MS
value: {{ .Values.operationTimeoutMs | quote }}
{{- template "strimzi.kafka.image.map" . }}
- name: STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE
value: {{ template "strimzi.image" (set . "key" "topicOperator") }}
- name: STRIMZI_DEFAULT_USER_OPERATOR_IMAGE
value: {{ template "strimzi.image" (set . "key" "userOperator") }}
- name: STRIMZI_DEFAULT_KAFKA_INIT_IMAGE
value: {{ template "strimzi.image" (set . "key" "kafkaInit") }}
- name: STRIMZI_DEFAULT_KAFKA_BRIDGE_IMAGE
value: {{ template "strimzi.image" (set . "key" "kafkaBridge") }}
- name: STRIMZI_DEFAULT_KANIKO_EXECUTOR_IMAGE
value: {{ template "strimzi.image" (set . "key" "kanikoExecutor") }}
- name: STRIMZI_DEFAULT_MAVEN_BUILDER
value: {{ template "strimzi.image" (set . "key" "mavenBuilder") }}
- name: STRIMZI_OPERATOR_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
{{- /* imagePullSecrets is allowed to be for backwards compatibility */ -}}
{{- if kindIs "string" .Values.image.imagePullSecrets }}
- name: STRIMZI_IMAGE_PULL_SECRETS
value: {{ .Values.image.imagePullSecrets }}
{{- else if kindIs "slice" .Values.image.imagePullSecrets }}
- name: STRIMZI_IMAGE_PULL_SECRETS
value: {{ template "strimzi.listPluck" (dict "list" .Values.image.imagePullSecrets "key" "name") }}
{{- end }}
{{- if .Values.image.operatorNamespaceLabels }}
- name: STRIMZI_OPERATOR_NAMESPACE_LABELS
value: {{ .Values.image.operatorNamespaceLabels }}
{{- end }}
{{- if .Values.image.imagePullPolicy }}
- name: STRIMZI_IMAGE_PULL_POLICY
value: {{ .Values.image.imagePullPolicy }}
{{- end }}
{{ if ne .Values.kubernetesServiceDnsDomain "cluster.local" }}- name: KUBERNETES_SERVICE_DNS_DOMAIN
value: {{ .Values.kubernetesServiceDnsDomain | quote }}{{ end }}
- name: STRIMZI_FEATURE_GATES
value: {{ .Values.featureGates | quote }}
{{- if .Values.labelsExclusionPattern }}
- name: STRIMZI_LABELS_EXCLUSION_PATTERN
value: {{ .Values.labelsExclusionPattern | quote }}
{{- end }}
{{- if ne .Values.generateNetworkPolicy true}}
- name: STRIMZI_NETWORK_POLICY_GENERATION
value: {{ .Values.generateNetworkPolicy | quote }}
{{- end }}
{{- if ne (int .Values.connectBuildTimeoutMs) 300000 }}
- name: STRIMZI_CONNECT_BUILD_TIMEOUT_MS
value: {{ .Values.connectBuildTimeoutMs | quote }}
{{- end }}
{{- if .Values.extraEnvs }}
{{ toYaml .Values.extraEnvs | indent 12 }}
{{- end }}
- name: STRIMZI_LEADER_ELECTION_ENABLED
{{- if .Values.leaderElection.enable }}
value: "true"
{{- else }}
value: "false"
{{- end }}
- name: STRIMZI_LEADER_ELECTION_LEASE_NAME
value: "strimzi-cluster-operator"
- name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: STRIMZI_LEADER_ELECTION_IDENTITY
valueFrom:
fieldRef:
fieldPath: metadata.name
livenessProbe:
httpGet:
path: /healthy
port: http
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
readinessProbe:
httpGet:
path: /ready
port: http
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
{{- with .Values.securityContext }}
securityContext: {{ toYaml .| nindent 12 }}
{{- end }}
resources:
{{ toYaml .Values.resources | indent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}

View File

@@ -0,0 +1,53 @@
{{- if and .Values.rbac.create .Values.createAggregateRoles -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-admin
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: entity-operator-role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
# Add these permissions to the "admin" and "edit" default roles.
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rules:
- apiGroups:
- "kafka.strimzi.io"
resources:
- kafkas
- kafkaconnects
- kafkaconnects/scale
- kafkamirrormakers
- kafkamirrormakers/scale
- kafkausers
- kafkatopics
- kafkabridges
- kafkabridges/scale
- kafkaconnectors
- kafkaconnectors/scale
- kafkamirrormaker2s
- kafkamirrormaker2s/scale
- kafkarebalances
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
- apiGroups:
- "core.strimzi.io"
resources:
- strimzipodsets
verbs:
- get
- list
- watch
- create
- delete
- patch
- update
{{- end -}}

View File

@@ -0,0 +1,39 @@
{{- if and .Values.rbac.create .Values.createAggregateRoles -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: strimzi-view
labels:
app: {{ template "strimzi.name" . }}
chart: {{ template "strimzi.chart" . }}
component: entity-operator-role
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
# Add these permissions to the "view" default role.
rbac.authorization.k8s.io/aggregate-to-view: "true"
rules:
- apiGroups:
- "kafka.strimzi.io"
resources:
- kafkas
- kafkaconnects
- kafkamirrormakers
- kafkausers
- kafkatopics
- kafkabridges
- kafkaconnectors
- kafkamirrormaker2s
- kafkarebalances
verbs:
- get
- list
- watch
- apiGroups:
- "core.strimzi.io"
resources:
- strimzipodsets
verbs:
- get
- list
- watch
{{- end -}}

View File

@@ -0,0 +1,26 @@
{{- if .Values.dashboards.enabled }}
{{- $files := .Files.Glob "files/grafana-dashboards/*.json" }}
{{- range $path, $fileContents := $files }}
{{- $dashboardName := regexReplaceAll "(^.*/)(.*)\\.json$" $path "${2}" }}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ $dashboardName | trunc 63 | trimSuffix "-" }}
namespace: {{ $.Values.dashboards.namespace | default $.Release.Namespace }}
labels:
component: grafana-dashboards
{{- if $.Values.dashboards.label }}
{{ $.Values.dashboards.label }}: {{ ternary $.Values.dashboards.labelValue "1" (not (empty $.Values.dashboards.labelValue)) | quote }}
{{- end }}
{{- with $.Values.dashboards.extraLabels }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- with $.Values.dashboards.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
data:
{{ $dashboardName }}.json: {{ $.Files.Get $path | toJson }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,5 @@
Thank you for installing {{ .Chart.Name }}-{{ .Chart.Version }}
To create a Kafka cluster refer to the following documentation.
https://strimzi.io/docs/operators/latest/deploying.html#deploying-cluster-operator-helm-chart-str

View File

@@ -0,0 +1,63 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "strimzi.name" -}}
{{- default "strimzi" .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "strimzi.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- if contains $name .Release.Name -}}
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "strimzi.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Creates the image name from the registry, repository, image, tag, and digest
- Priority is given to digests over tags
- Registry, repository, and image will be joined with '/' if values are not blank
- tagSuffix is added to tagPrefix or default tag. To ignore the suffix, use tag.
- tagSuffix can be ignored by using tag instead of tagPrefix
To use, add the following key/value pairs to the scope:
- "key" [optional]: the key to lookup under .Values for the image map
- "tagSuffix" [optional]: the suffix to add to tagPrefix or the default tag
- Example: `template "strimzi.image" (merge . (dict "key" "tlsSidecarEntityOperator" "tagSuffix" "-kafka-3.1.0"))`
*/}}
{{- define "strimzi.image" -}}
{{- $vals := ternary .Values.image (index .Values .key).image (empty .key) -}}
{{- $ref := join "/" (compact (list (default .Values.defaultImageRegistry $vals.registry) (default .Values.defaultImageRepository $vals.repository) (default .Values.defaultImageName $vals.name))) -}}
{{- $tag := join "" (compact (list (coalesce $vals.tag $vals.tagPrefix .Values.defaultImageTag) (ternary .tagSuffix "" (empty $vals.tag)))) -}}
{{- join "" (compact (list $ref (ternary ":" "@" (empty $vals.digest)) (default $tag $vals.digest))) -}}
{{- $_ := unset . "key" -}}
{{- $_ := unset . "tagSuffix" -}}
{{- end -}}
{{/*
Create a list of comma-separated values corresponding to a given key in a map array.
*/}}
{{- define "strimzi.listPluck" -}}
{{- $pluckedList := list -}}
{{- range .list -}}
{{- $pluckedList = append $pluckedList (get . $.key) -}}
{{- end -}}
{{- join "," $pluckedList -}}
{{- end -}}

View File

@@ -0,0 +1,34 @@
{{/* vim: set filetype=mustache: */}}
{{/* This file is generated in helm-charts/Makefile */}}
{{/* DO NOT EDIT BY HAND */}}
{{/* Generate the kafka image map */}}
{{- define "strimzi.kafka.image.map" }}
- name: STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE
value: {{ template "strimzi.image" (merge . (dict "key" "tlsSidecarEntityOperator" "tagSuffix" "-kafka-3.7.0")) }}
- name: STRIMZI_DEFAULT_KAFKA_EXPORTER_IMAGE
value: {{ template "strimzi.image" (merge . (dict "key" "kafkaExporter" "tagSuffix" "-kafka-3.7.0")) }}
- name: STRIMZI_DEFAULT_CRUISE_CONTROL_IMAGE
value: {{ template "strimzi.image" (merge . (dict "key" "cruiseControl" "tagSuffix" "-kafka-3.7.0")) }}
- name: STRIMZI_KAFKA_IMAGES
value: |
3.6.0={{ template "strimzi.image" (merge . (dict "key" "kafka" "tagSuffix" "-kafka-3.6.0")) }}
3.6.1={{ template "strimzi.image" (merge . (dict "key" "kafka" "tagSuffix" "-kafka-3.6.1")) }}
3.7.0={{ template "strimzi.image" (merge . (dict "key" "kafka" "tagSuffix" "-kafka-3.7.0")) }}
- name: STRIMZI_KAFKA_CONNECT_IMAGES
value: |
3.6.0={{ template "strimzi.image" (merge . (dict "key" "kafkaConnect" "tagSuffix" "-kafka-3.6.0")) }}
3.6.1={{ template "strimzi.image" (merge . (dict "key" "kafkaConnect" "tagSuffix" "-kafka-3.6.1")) }}
3.7.0={{ template "strimzi.image" (merge . (dict "key" "kafkaConnect" "tagSuffix" "-kafka-3.7.0")) }}
- name: STRIMZI_KAFKA_MIRROR_MAKER_IMAGES
value: |
3.6.0={{ template "strimzi.image" (merge . (dict "key" "kafkaMirrorMaker" "tagSuffix" "-kafka-3.6.0")) }}
3.6.1={{ template "strimzi.image" (merge . (dict "key" "kafkaMirrorMaker" "tagSuffix" "-kafka-3.6.1")) }}
3.7.0={{ template "strimzi.image" (merge . (dict "key" "kafkaMirrorMaker" "tagSuffix" "-kafka-3.7.0")) }}
- name: STRIMZI_KAFKA_MIRROR_MAKER_2_IMAGES
value: |
3.6.0={{ template "strimzi.image" (merge . (dict "key" "kafkaMirrorMaker2" "tagSuffix" "-kafka-3.6.0")) }}
3.6.1={{ template "strimzi.image" (merge . (dict "key" "kafkaMirrorMaker2" "tagSuffix" "-kafka-3.6.1")) }}
3.7.0={{ template "strimzi.image" (merge . (dict "key" "kafkaMirrorMaker2" "tagSuffix" "-kafka-3.7.0")) }}
{{- end -}}

View File

@@ -0,0 +1,189 @@
# Default values for strimzi-kafka-operator.
# Default replicas for the cluster operator
replicas: 1
# If you set `watchNamespaces` to the same value as ``.Release.Namespace` (e.g. `helm ... --namespace $NAMESPACE`),
# the chart will fail because duplicate RoleBindings will be attempted to be created in the same namespace
watchNamespaces: []
watchAnyNamespace: false
defaultImageRegistry: quay.io
defaultImageRepository: strimzi
defaultImageTag: 0.40.0
image:
registry: ""
repository: ""
name: operator
tag: ""
# imagePullSecrets:
# - name: secretname
logVolume: co-config-volume
logConfigMap: strimzi-cluster-operator
logConfiguration: ""
logLevel: ${env:STRIMZI_LOG_LEVEL:-INFO}
fullReconciliationIntervalMs: 120000
operationTimeoutMs: 300000
kubernetesServiceDnsDomain: cluster.local
featureGates: ""
tmpDirSizeLimit: 1Mi
# Example on how to configure extraEnvs
# extraEnvs:
# - name: JAVA_OPTS
# value: "-Xms256m -Xmx256m"
extraEnvs: []
tolerations: []
affinity: {}
annotations: {}
labels: {}
nodeSelector: {}
priorityClassName: ""
podSecurityContext: {}
securityContext: {}
rbac:
create: yes
serviceAccountCreate: yes
serviceAccount: strimzi-cluster-operator
leaderElection:
enable: true
# https://kubernetes.io/docs/tasks/run-application/configure-pdb/
podDisruptionBudget:
enabled: false
# The PDB definition only has two attributes to control the availability requirements: minAvailable or maxUnavailable (mutually exclusive).
# Field maxUnavailable tells how many pods can be down and minAvailable tells how many pods must be running in a cluster.
# The pdb template will check values according to below order
#
# {{- if .Values.podDisruptionBudget.minAvailable }}
# minAvailable: {{ .Values.podDisruptionBudget.minAvailable }}
# {{- end }}
# {{- if .Values.podDisruptionBudget.maxUnavailable }}
# maxUnavailable: {{ .Values.podDisruptionBudget.maxUnavailable }}
# {{- end }}
#
# If both values are set, the template will use the first one and ignore the second one. currently by default minAvailable is set to 1
minAvailable: 1
maxUnavailable:
# If you are using the grafana dashboard sidecar,
# you can import some default dashboards here
dashboards:
enabled: false
namespace: ~
label: grafana_dashboard # this is the default value from the grafana chart
labelValue: "1" # this is the default value from the grafana chart
annotations: {}
extraLabels: {}
# Docker images that operator uses to provision various components of Strimzi. To use your own registry prefix the
# repository name with your registry URL.
# Ex) repository: registry.xyzcorp.com/strimzi/kafka
kafka:
image:
registry: ""
repository: ""
name: kafka
tagPrefix: ""
kafkaConnect:
image:
registry: ""
repository: ""
name: kafka
tagPrefix: ""
topicOperator:
image:
registry: ""
repository: ""
name: operator
tag: ""
userOperator:
image:
registry:
repository:
name: operator
tag: ""
kafkaInit:
image:
registry: ""
repository: ""
name: operator
tag: ""
tlsSidecarEntityOperator:
image:
registry: ""
repository: ""
name: kafka
tagPrefix: ""
kafkaMirrorMaker:
image:
registry: ""
repository: ""
name: kafka
tagPrefix: ""
kafkaBridge:
image:
registry: ""
repository:
name: kafka-bridge
tag: 0.28.0
kafkaExporter:
image:
registry: ""
repository: ""
name: kafka
tagPrefix: ""
kafkaMirrorMaker2:
image:
registry: ""
repository: ""
name: kafka
tagPrefix: ""
cruiseControl:
image:
registry: ""
repository: ""
name: kafka
tagPrefix: ""
kanikoExecutor:
image:
registry: ""
repository: ""
name: kaniko-executor
tag: ""
mavenBuilder:
image:
registry: ""
repository: ""
name: maven-builder
tag: ""
resources:
limits:
memory: 384Mi
cpu: 1000m
requests:
memory: 384Mi
cpu: 200m
livenessProbe:
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
initialDelaySeconds: 10
periodSeconds: 30
createGlobalResources: true
# Create clusterroles that extend existing clusterroles to interact with strimzi crds
# Ref: https://kubernetes.io/docs/reference/access-authn-authz/rbac/#aggregated-clusterroles
createAggregateRoles: false
# Override the exclude pattern for exclude some labels
labelsExclusionPattern: ""
# Controls whether Strimzi generates network policy resources (By default true)
generateNetworkPolicy: true
# Override the value for Connect build timeout
connectBuildTimeoutMs: 300000

View File

@@ -0,0 +1,2 @@
strimzi-kafka-operator:
watchAnyNamespace: true