Использование Секретов Kubernetes В Конфигурациях Kafka Connect

Kafka Connect — это платформа интеграции, являющаяся частью проекта Apache Kafka. Его можно развернуть на платформах Kubernetes и Red Hat OpenShift с помощью операторов Стримзи И Стримы Red Hat AMQ .

Kafka Connect имеет два типа соединителей: источник и приемник.

Первые предназначены для загрузки данных в Kafka из внешних систем, вторые — для загрузки данных из Kafka. Подключение к внешним системам обычно требует аутентификации, поэтому при настройке коннектора необходимо указать учетные данные.

В этом посте мы покажем вам, как использовать секреты Kubernetes для хранения учетных данных при настройке коннекторов.



Использование секретов Kubernetes в конфигурациях Kafka Connect

Здесь мы будем использовать исходный коннектор S3, входящий в состав Apache Camel Kafka (подробнее см.

Здесь ), и на его примере мы покажем, как настроить коннектор, чтобы он использовал секрет. Описанная здесь процедура настройки универсальна и подходит для любого типа разъема.

Мы будем использовать коннектор S3 для подключения к хранилищу Amazon AWS S3 и загрузки файлов из корзины S3 в тему Apache Kafka. Для подключения к хранилищу S3 нам нужны следующие учетные данные AWS: ключ доступа и секретный ключ.

Итак, начнем с подготовки секрета с учетными данными.



Создайте секрет с учетными данными

Прежде всего, мы создаем простой файл свойств aws-credentials.properties и вводим в него учетные данные, например:
  
  
  
  
  
  
  
  
  
  
  
  
  
   

aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Указанные здесь учетные данные должны предоставлять доступ к корзине S3, из которой будут считываться данные.

Теперь вам нужно из этого файла сгенерировать секрет, это делается следующей командой:

$ kubectl create secret generic aws-credentials --from-file=.

/aws-credentials.properties



Создание нового образа контейнера с помощью коннектора

Далее нам нужно подготовить новый образ Docker с нашим коннектором.

Если используется Стримзи, то Dockerfile для добавления нашего коннектора выглядит так:

FROM strimzi/kafka:0.16.1-kafka-2.4.0 USER root:root COPY .

/my-plugins/ /opt/kafka/plugins/ USER 1001

Если используется Red Hat AMQ Streams, файл Dockerfile выглядит следующим образом:

FROM registry.redhat.io/amq7/amq-streams-kafka-23:1.3.0 USER root:root COPY .

/my-plugins/ /opt/kafka/plugins/ USER jboss:jboss

Затем с помощью Dockerfile нам нужно собрать образ контейнера, содержащий нужные нам коннекторы, и поместить его в реестр.

Если у вас нет своего частного реестра, то вы можете использовать, например, публичные реестры.

Набережная или Докер-Хаб .



Развертывание Apache Kafka Connect

Итак, имея образ контейнера, мы можем развернуть Apache Kafka Connect, создав в Kubernetes следующий ресурс:

apiVersion: kafka.strimzi.io/v1alpha1 kind: KafkaConnect metadata: name: my-connect-cluster spec: image: docker.io/scholzj/kafka:camel-kafka-2.4.0 replicas: 3 bootstrapServers: my-cluster-kafka-bootstrap:9092 externalConfiguration: volumes: - name: aws-credentials secret: secretName: aws-credentials config: config.providers: file config.providers.file.class: org.apache.kafka.common.config.provider.FileConfigProvider key.converter: org.apache.kafka.connect.json.JsonConverter value.converter: org.apache.kafka.connect.json.JsonConverter key.converter.schemas.enable: false value.converter.schemas.enable: false

На что следует обратить внимание в этом описании? Во-первых, на поле изображения, которое сообщает оператору развертывания Apache Kafka Connect, какой образ следует использовать — то есть тот образ, куда мы включили нужные нам коннекторы.

В нашем примере образ контейнера, собранный на предыдущем шаге, расположен в реестре Docker Hub по адресу scholzj/kafka:camel-kafka-2.4.0, поэтому наше поле изображения выглядит следующим образом:

image: docker.io/scholzj/kafka:camel-kafka-2.4.0

Во-вторых, раздел externalConfiguration:

externalConfiguration: volumes: - name: aws-credentials secret: secretName: aws-credentials

Здесь мы говорим оператору смонтировать секретные aws-учетные данные Kubernetes (мы создали их выше) в поды Apache Kafka Connect. Перечисленные здесь секреты будут смонтированы по пути /opt/kafka/external-configuration/, где указано имя секрета.

Наконец, обратите внимание на раздел конфигурации, в котором мы указываем Apache Kafka Connect использовать FileConfigProvider в качестве поставщика конфигурации:

config: config.providers: file config.providers.file.class: org.apache.kafka.common.config.provider.FileConfigProvider

Поставщик конфигурации — это способ не указывать параметры непосредственно в конфигурации, а брать их из другого источника.

В нашем случае мы создаем поставщика конфигурации с именем file, который будет использовать класс FileConfigProvider. Этот провайдер является частью Apache Kafka. FileConfigProvider может читать файлы свойств и извлекать из них значения, и мы будем использовать его для загрузки ключей API для нашей учетной записи Amazon AWS.

Создайте соединитель с помощью REST API Apache Kafka Connect.

Обычно вам придется подождать минуту или две, пока Apache Kafka Connect развернется, прежде чем создавать экземпляр соединителя.

В предыдущих версиях Strimzi и Red Hat AMQ Streams для этого приходилось использовать REST API. Теперь мы можем создать соединитель, отправив POST следующий JSON:

{ "name": "s3-connector", "config": { "connector.class": "org.apache.camel.kafkaconnector.CamelSourceConnector", "tasks.max": "1", "camel.source.kafka.topic": "s3-topic", "camel.source.maxPollDuration": "10000", "camel.source.url": " aws-s3://camel-connector-testЭautocloseBody=false ", "key.converter": "org.apache.kafka.connect.storage.StringConverter", "value.converter": "org.apache.camel.kafkaconnector.converters.S3ObjectConverter", "camel.component.aws-s3.configuration.access-key": "${ file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_access_key_id }", "camel.component.aws-s3.configuration.secret-key": "${ file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_secret_access_key }", "camel.component.aws-s3.configuration.region": "US_EAST_1" } }

Конфигурация соединителя содержит ключи API AWS в полях Camel.comComponent.aws-s3.configuration.access-key и Camel.comComponent.aws-s3.configuration.secret-key. Вместо того, чтобы указывать значения напрямую, мы просто ссылаемся на поставщика конфигурации файлов, чтобы загрузить поля aws_access_key_id и aws_secret_access_key из нашего файла aws-credentials.properties. Обратите внимание, как именно мы обращаемся к поставщику конфигурации: указываем путь к файлу, который нужно использовать, и через двоеточие — имя ключа, который нужно извлечь, вот так:

"camel.component.aws-s3.configuration.access-key": "${file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_access_key_id}"

А вот так:

"camel.component.aws-s3.configuration.secret-key": "${file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_secret_access_key}"

Вы можете отправить эти результаты в REST API Apache Kafka Connect, например, с помощью команды Curl.

$ curl -X POST -H "Content-Type: application/json" -d connector-config.json http://my-connect-cluster-connect-api:8083/connectors

Одним из преимуществ поставщиков конфигурации является то, что они позволяют вам скрыть параметры конфигурации, которые вы хотите сохранить в секрете:

$ curl http://my-connect-cluster-connect-api:8083/connectors/s3-connector { "name": "s3-connector", "config": { "connector.class": "org.apache.camel.kafkaconnector.CamelSourceConnector", "camel.source.maxPollDuration": "10000", "camel.source.url": " aws-s3://camel-connector-testЭautocloseBody=false ", "camel.component.aws-s3.configuration.region": "US_EAST_1", "camel.component.aws-s3.configuration.secret-key": "${ file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_secret_access_key }", "tasks.max": "1", "name": "s3-connector", "value.converter": "org.apache.camel.kafkaconnector.converters.S3ObjectConverter", "camel.component.aws-s3.configuration.access-key": "${ file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_access_key_id }", "key.converter": "org.apache.kafka.connect.storage.StringConverter", "camel.source.kafka.topic": "s3-topic" }, "tasks": [ { "connector": "s3-connector", "task": 0 } ], "type": "source" }



Создание коннектора с помощью оператора Стримзи

Начиная с версии 0.16.0, Strimzi также представил новый оператор для создания коннекторов с использованием следующего пользовательского ресурса YAML (в KafkaConnector вы также можете напрямую использовать поставщика конфигурации):

apiVersion: kafka.strimzi.io/v1alpha1 kind: KafkaConnector metadata: name: s3-connector labels: strimzi.io/cluster : my-connect-cluster spec: class: org.apache.camel.kafkaconnector.CamelSourceConnector tasksMax: 1 config: key.converter: org.apache.kafka.connect.storage.StringConverter value.converter: org.apache.camel.kafkaconnector.converters.S3ObjectConverter camel.source.kafka.topic: s3-topic camel.source.url: aws-s3://camel-connector-testЭautocloseBody=false camel.source.maxPollDuration: 10000 camel.component.aws-s3.configuration.access-key: ${ file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_access_key_id } camel.component.aws-s3.configuration.secret-key: ${ file:/opt/kafka/external-configuration/aws-credentials/aws-credentials.properties:aws_secret_access_key } camel.component.aws-s3.configuration.region: US_EAST_1



Давайте подведем итоги

Безопасность секретов в Kubernetes имеет свои ограничения, и любой пользователь с правами выполнения внутри контейнера в любом случае сможет прочитать прикрепленные секреты.

Но как минимум метод, описанный в этой статье, гарантирует, что учетные данные, ключи API и другая конфиденциальная информация не будут раскрыты при использовании REST API или пользовательских ресурсов в KafkaConnector. Теги: #разработка Linux #ИТ-инфраструктура #открытый исходный код #Kubernetes #docker #настройка Linux #Apache #Red Hat #Openshift

Вместе с данным постом часто просматривают: