ansible-devops icon indicating copy to clipboard operation
ansible-devops copied to clipboard

Enhancement to allow specify subscription channel for Kafka

Open rene-oromtz opened this issue 11 months ago • 0 comments

Feature and motivation

This is an enhancement to work alongside IBM Storage Fusion. Storage Fusion BR requires AMQ-Streams, which if customer are using is the only operator allowed to use for Kafka, however, Fusion versions does not use "latest" operator version, in this case, for example, Fusion 2.9.0 (latest available) uses AMQ-Streams (now Streams for Apache Kafka) version 2.7.0-5 while the Kafka role attempts to install 2.8.0-0.

The following changes to Kafka role are suggested:

ansible-devops/roles/kafka/defaults/main.yaml From:

# vars for red hat amq or strimzi
amq_exists: false # initialize variable
kafka_defaults:
  strimzi:
    version: "3.7.0" # Supported versions for strimzi-cluster-operator.v0.40.0 are: [3.6.0, 3.6.1, 3.7.0]
    namespace: "strimzi"
    operator_name: "strimzi-kafka-operator"
    alias_name: "Strimzi"
  redhat:
    version: "3.7.0"
    namespace: "amq-streams"
    operator_name: "amq-streams"
    alias_name: "Red Hat AMQ Streams"
  aws:
    version: "3.3.1"

kafka_version: "{{ lookup('env', 'KAFKA_VERSION') | default(kafka_defaults[kafka_provider].version, true) }}"
kafka_namespace: "{{ lookup('env', 'KAFKA_NAMESPACE') | default(kafka_defaults[kafka_provider].namespace, true) }}"
kafka_operator_name: "{{ kafka_defaults[kafka_provider].operator_name }}"

To:

# vars for red hat amq or strimzi
amq_exists: false # initialize variable
kafka_defaults:
  strimzi:
    channel: "stable"
    version: "3.7.0" # Supported versions for strimzi-cluster-operator.v0.40.0 are: [3.6.0, 3.6.1, 3.7.0]
    namespace: "strimzi"
    operator_name: "strimzi-kafka-operator"
    alias_name: "Strimzi"
  redhat:
    channel: "stable"
    version: "3.7.0"
    namespace: "amq-streams"
    operator_name: "amq-streams"
    alias_name: "Red Hat AMQ Streams"
  aws:
    channel: "stable"
    version: "3.3.1"

kafka_channel: "{{ lookup('env', 'KAFKA_CHANNEL') | default(kafka_defaults[kafka_provider].channel, true) }}"
kafka_version: "{{ lookup('env', 'KAFKA_VERSION') | default(kafka_defaults[kafka_provider].version, true) }}"
kafka_namespace: "{{ lookup('env', 'KAFKA_NAMESPACE') | default(kafka_defaults[kafka_provider].namespace, true) }}"
kafka_operator_name: "{{ kafka_defaults[kafka_provider].operator_name }}"

ansible-devops/roles/kafka/tasks/provider/redhat/install-kafka.yml From:

# 2. Lookup the packagemanifest for amq-streams / strimzi
# -----------------------------------------------------------------------------
- name: Get {{ kafka_operator_name }} package manifest
  kubernetes.core.k8s_info:
    api_version: packages.operators.coreos.com/v1
    kind: PackageManifest
    name: "{{ kafka_operator_name }}"
    namespace: openshift-marketplace # Note: A namespace must be provided when calling packages.operators.coreos.com/v1
  register: kafka_manifest

- name: Assert that PackageManifest exists
  ansible.builtin.assert:
    that:
      - kafka_manifest is defined
      - kafka_manifest.resources is defined
      - kafka_manifest.resources | length == 1
    fail_msg: "PackageManifest not found: {{ kafka_operator_name }}"

- name: Set the subscription information
  set_fact:
    kafka_source: "{{ kafka_manifest.resources[0].status.catalogSource }}"
    kafka_source_namespace: "{{ kafka_manifest.resources[0].status.catalogSourceNamespace }}"
    kafka_default_channel: "{{ kafka_manifest.resources[0].status.defaultChannel }}"

To:

# 2. Lookup the packagemanifest for amq-streams / strimzi
# -----------------------------------------------------------------------------
- name: Get {{ kafka_operator_name }} package manifest
  kubernetes.core.k8s_info:
    api_version: packages.operators.coreos.com/v1
    kind: PackageManifest
    name: "{{ kafka_operator_name }}"
    namespace: openshift-marketplace # Note: A namespace must be provided when calling packages.operators.coreos.com/v1
  register: kafka_manifest

- name: Assert that PackageManifest exists
  ansible.builtin.assert:
    that:
      - kafka_manifest is defined
      - kafka_manifest.resources is defined
      - kafka_manifest.resources | length == 1
    fail_msg: "PackageManifest not found: {{ kafka_operator_name }}"

- name: Set the subscription information
  set_fact:
    kafka_source: "{{ kafka_manifest.resources[0].status.catalogSource }}"
    kafka_source_namespace: "{{ kafka_manifest.resources[0].status.catalogSourceNamespace }}"
    kafka_default_channel: "{{ kafka_channel | default(kafka_manifest.resources[0].status.defaultChannel) }}"

Usage example

In order to avoid having conflicting versions of the operator, this enhancement can be made to allow user to specify default subscription channel, in this case, to match as closely as possible with Fusion, we can choose channel amq-streams-2.7.x instead of stable, the installed version will be 2.7.0-7 which is not the same as the one Fusion uses but at least is not a bigger "jump" between versions as is just a minor release.

This can also provide more control over the Kafka version the customer want to use.

rene-oromtz avatar Jan 07 '25 23:01 rene-oromtz