Kafka Connect — это платформа интеграции, являющаяся частью проекта Apache Kafka. Его можно развернуть на платформах Kubernetes и Red Hat OpenShift с помощью операторов Стримзи И Стримы Red Hat AMQ .
Kafka Connect имеет два типа соединителей: источник и приемник.
Первые предназначены для загрузки данных в Kafka из внешних систем, вторые — для загрузки данных из Kafka. Подключение к внешним системам обычно требует аутентификации, поэтому при настройке коннектора необходимо указать учетные данные.
В этом посте мы покажем вам, как использовать секреты Kubernetes для хранения учетных данных при настройке коннекторов.
Здесь мы будем использовать исходный коннектор S3, входящий в состав Apache Camel Kafka (подробнее см.
Здесь ), и на его примере мы покажем, как настроить коннектор, чтобы он использовал секрет. Описанная здесь процедура настройки универсальна и подходит для любого типа разъема.
Мы будем использовать коннектор S3 для подключения к хранилищу Amazon AWS S3 и загрузки файлов из корзины S3 в тему Apache Kafka. Для подключения к хранилищу S3 нам нужны следующие учетные данные AWS: ключ доступа и секретный ключ.
Итак, начнем с подготовки секрета с учетными данными.
Создайте секрет с учетными данными
Прежде всего, мы создаем простой файл свойств aws-credentials.properties и вводим в него учетные данные, например:Указанные здесь учетные данные должны предоставлять доступ к корзине S3, из которой будут считываться данные.aws_access_key_id=AKIAIOSFODNN7EXAMPLE aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Теперь вам нужно из этого файла сгенерировать секрет, это делается следующей командой: $ 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
-
В Китае Пропало 10 Тысяч Доменов
19 Oct, 24 -
«Афиша» Покупает Nightparty.ru
19 Oct, 24