Вопрос или проблема
Я развернул кластер Kafka strimzi в своей локальной среде. Я также развернул strimzi connect в своей локальной среде. Я хочу запустить JDBC Source Connector, чтобы читать данные из Postgresql и записывать их в тему. Когда я запускаю свой код, файл jar JDBC коннектора не копируется в папку /opt/kafka/plugins. Когда я вхожу в pod connect и вижу, что папка plugins не создана, когда развернут кластер connect. Если я создаю ее вручную и пытаюсь скопировать файл jar, требуется перезагрузка, и при перезагрузке все сбрасывается.
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: my-connect-cluster
namespace: strimzi
spec:
replicas: 1
bootstrapServers: my-kafka-cluster-kafka-bootstrap:9092
config:
group.id: "connect-cluster"
offset.storage.topic: "connect-cluster-offsets"
config.storage.topic: "connect-cluster-configs"
status.storage.topic: "connect-cluster-status"
plugin.path: "/opt/kafka/external-configuration/plugins" # Путь к плагинам Kafka Connect
image: strimzi/kafka-connect:latest
template:
pod:
securityContext:
runAsUser: 0 # Запуск от имени root для предоставления необходимых прав
externalConfiguration:
volumes:
- name: plugins
configMap:
name: my-connector-plugins # Используйте ConfigMap для хранения коннекторов
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
name: postgres-source-connector
namespace: strimzi
labels:
strimzi.io/cluster: my-connect-cluster
spec:
class: io.confluent.connect.jdbc.JdbcSourceConnector
tasksMax: 1
config:
connector.class: io.confluent.connect.jdbc.JdbcSourceConnector
tasks.max: "1"
topic.prefix: "postgres-"
connection.url: "jdbc:postgresql://postgres:5432/exampledb"
connection.user: "postgres" # Имя пользователя для PostgreSQL
connection.password: "examplepassword" # Пароль для PostgreSQL
table.whitelist: "users"
mode: "bulk"
poll.interval.ms: "5000"
timestamp.column.name: "last_modified"
numeric.mapping: "best_fit"
value.converter: org.apache.kafka.connect.json.JsonConverter
value.converter.schemas.enable: "false"
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
labels:
app: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:13
env:
- name: POSTGRES_PASSWORD
value: "examplepassword" # Измените это на более безопасный пароль
- name: POSTGRES_DB
value: "exampledb"
ports:
- containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
selector:
app: postgres
ports:
- protocol: TCP
port: 5432
targetPort: 5432
Ответ или решение
Решение проблемы с отсутствием папки плагинов в Strimzi Connect Operator
При развертывании Kafka Connect с использованием Strimzi в локальной среде, вы столкнулись с проблемой отсутствия папки /opt/kafka/plugins
, необходимой для работы JDBC Source Connector. Рассмотрим, как правильно настроить Strimzi, чтобы плагин корректно загружался и папка создавалась автоматически.
1. Структура и конфигурация ресурсов
Ваши манифесты показывают, что вы используете KafkaConnect
, KafkaConnector
, а также развернули PostgreSQL как отдельный сервис. Важно учесть, что Strimzi имеет особую логику для работы с плагинами, и вам нужно следить за несколькими моментами:
-
Spec-класс KafkaConnect: Параметр
plugin.path
определяет, где Kafka Connect будет искать плагины. В вашем случае это/opt/kafka/external-configuration/plugins
. Убедитесь, что эта директория указана правильно. -
ConfigMap для плагинов: Вы создали ресурс
ConfigMap
под названиемmy-connector-plugins
, но важно убедиться, что этотConfigMap
действительно создан и включает JAR-файл для JDBC Connector. Проверьте, правильно ли прописаны все необходимые данные вConfigMap
и что он содержит требуемые файлы.
2. Настройка ConfigMap
Пример создания ConfigMap
, который включает JAR-файл вашего JDBC Connector:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-connector-plugins
namespace: strimzi
data:
jdbc-connector.jar: |
# здесь будет содержимое jar файла, или вы можете указывать его локальный путь при сборке в вашем CI/CD
Обратите внимание, что JAR-файл должен быть доступен в ConfigMap
, и его содержимое должно быть корректным.
3. Использование Volume в KafkaConnect
В вашем определении KafkaConnect
добавьте Volume, который будет использовать ConfigMap
для загрузки плагинов:
template:
pod:
volumes:
- name: plugins
configMap:
name: my-connector-plugins # Указываем правильное имя ConfigMap
volumeMounts:
- name: plugins
mountPath: /opt/kafka/external-configuration/plugins
4. Перезапуск и диагностика
После внесения изменений в конфигурацию:
- Убедитесь, что вы корректно развернули все сервисы опять, вы можете использовать команду:
kubectl apply -f <имя_вашего_файла>.yaml
- Используйте команду для контроля подов, чтобы убедиться, что все поды переинициализировались и работали:
kubectl get pods -n strimzi
- Логи Kafka Connect также помогут вам диагностировать проблемы:
kubectl logs -f <имя_connect_pod> -n strimzi
5. Заключение
Следуя этим шагам, вы сможете устранить проблему с отсутствием папки плагинов в Strimzi Connect Operator. Проведите детальную проверку на каждом этапе настройки, чтобы гарантировать успешное подключение к PostgreSQL и загрузку JDBC Source Connector. Убедитесь, что все ресурсы корректно настроены, и конфигурации правильно указаны, что обеспечит стабильную работу вашей интеграционной схемы.