kafka对接Rancher日志

概述

Rancher应用商店自带的kafka可以方便的对接Rancher日志,但是不支持sasl认证。

如果有认证需求,可以使用bitnami仓库的kafka,这个kafka带有相关的认证参数,可以很方便的开启sasl相关的认证。

参考:https://github.com/bitnami/charts/tree/master/bitnami/kafka

环境准备

软件 版本
kubernetes v1.19.3
Rancher v2.4.8 | v2.5.2
kafka 2.6.0
kafka-chart 11.8.9
helm 3.4.0

正常对接kafka集群

如果是需要开启SASL认证,可以直接跳到后面开启SASL认证方式的内容

1、helm添加bitnami库

  1. helm repo add bitnami https://charts.bitnami.com/bitnami
  2. helm repo update

2、下载 kafka 对应的chart压缩文件

bitnami库国内可能访问不太友好,需要翻一下墙。。。

  1. helm pull bitnami/kafka --version 11.8.9

上述命令会下载一个kafka-11.8.9-tgz的压缩文件,解压该文件

  1. tar -zxvf kafka-11.8.9-tgz

查看解压目录内容

  1. # cd kafka/
  2. # ls
  3. charts Chart.yaml files README.md requirements.lock requirements.yaml templates values-production.yaml values.yaml

可以看到有两个values文件,分别是values.yamlvalues-production.yaml

其中values.yaml会启动一个最简单的kafka集群,

values-production.yaml中的配置会包含更多面向生产的配置,例如启用持久化存储,启用sasl相关认证等。

3、启动kafka集群

最简化启动kafka集群,可以添加这两个参数,取消持久化存储

  1. kubectl create ns kafka
  2. ## 进入到kafka目录下再执行下面的命令
  3. helm install kafka -n kafka -f values.yaml --set persistence.enabled=false --set zookeeper.persistence.enabled=false .

或者如果k8s有持久化存储,可以设置storage Class,将xxx替换为对应的storage Class

  1. helm install kafka -n kafka -f values.yaml --set global.storageClass=xxx .

执行完helm install后会输出以下内容

  1. NAME: kafka
  2. LAST DEPLOYED: Wed Nov 25 17:04:50 2020
  3. NAMESPACE: kafka
  4. STATUS: deployed
  5. REVISION: 1
  6. TEST SUITE: None
  7. NOTES:
  8. ** Please be patient while the chart is being deployed **
  9. Kafka can be accessed by consumers via port 9092 on the following DNS name from within your cluster:
  10. kafka.kafka.svc.cluster.local
  11. Each Kafka broker can be accessed by producers via port 9092 on the following DNS name(s) from within your cluster:
  12. kafka-0.kafka-headless.kafka.svc.cluster.local:9092
  13. To create a pod that you can use as a Kafka client run the following commands:
  14. kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:2.6.0-debian-10-r57 --namespace kafka --command -- sleep infinity
  15. kubectl exec --tty -i kafka-client --namespace kafka -- bash
  16. PRODUCER:
  17. kafka-console-producer.sh \
  18. --broker-list kafka-0.kafka-headless.kafka.svc.cluster.local:9092 \
  19. --topic test
  20. CONSUMER:
  21. kafka-console-consumer.sh \
  22. --bootstrap-server kafka.kafka.svc.cluster.local:9092 \
  23. --topic test \
  24. --from-beginning

查看pod、svc状态

  1. # kubectl get pod,svc -n kafka
  2. NAME READY STATUS RESTARTS AGE
  3. pod/kafka-0 0/1 Pending 0 34s
  4. pod/kafka-client 1/1 Running 0 3d21h
  5. pod/kafka-zookeeper-0 1/1 Running 0 34s
  6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. service/kafka ClusterIP 10.43.97.41 <none> 9092/TCP 34s
  8. service/kafka-headless ClusterIP None <none> 9092/TCP,9093/TCP 34s
  9. service/kafka-zookeeper ClusterIP 10.43.127.105 <none> 2181/TCP,2888/TCP,3888/TCP 34s
  10. service/kafka-zookeeper-headless ClusterIP None <none> 2181/TCP,2888/TCP,3888/TCP 34s

4、操作kafka集群

根据helm创建成功的提示,我们可以创建客户端去执行kafka相关的操作

创建kafka-client的pod

  1. kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:2.6.0-debian-10-r57 --namespace kafka --command -- sleep infinity

进入到容器

  1. kubectl -n kafka exec -it kafka-client bash

生产者

kafka有生产者和消费者的概念,生产者会生产数据,消费者去消费生产者产生的数据,具体可以先了解一下相关的概念

首先生产者先生产数据,执行如下命令,可以进入到生产者的input端

  1. kafka-console-producer.sh --broker-list kafka-0.kafka-headless.kafka.svc.cluster.local:9092 --topic test

例如我们输入rancher run everywhere

  1. > rancher run everywhere

消费者

然后消费者消费数据

  1. kafka-console-consumer.sh --bootstrap-server kafka.kafka.svc.cluster.local:9092 --topic test --from-beginning

输入上述命令,就可以查看到刚刚在生产者生产的数据

  1. rancher run everything

5、对接Rancher logging

首先在Rancher上创建一个项目,并部署一个nginx应用

接着在跳转到工具 -> 日志,选择Kafka

有两种方式连接到kafka集群,分别是zookeeper和broker,这里以zookeeper访问端点类型为例

参数解释:

访问地址http://kafka-zookeeper.kafka:2181,这里填写对应的访问地址,由于选择的是zookeeper,所以填写zookeeper相关的service访问地址,也可以写clusterIP,默认端口是2181

主题:rancher,日志将会发送到这个主题上

其他参数:

刷新时间间隔:默认60s,如果是测试环境,可以设置为10s更快的查看效果


点击测试按钮,等待结果返回验证通过后,点击保存按钮,Rancher会在System项目下创建相应的fluentd工作负载,到这里日志对接基本没问题了

6、验证效果

访问nginx应用,然后等待对应的刷新时间间隔后,在kafka-client中查看是否能消费到数据

开启SASL认证方式

values-production.yaml中的配置会包含更多面向生产的配置,例如启用持久化存储,启用sasl相关认证等,所以可以直接使用这个配置文件进行创建kafka集群,会自动sasl相关认证的功能

1、helm 安装kafka

这里为了方便都关闭了,取消了持久化存储,关闭了相关metric,设置生产环境按需开启

其中autoCreateTopicsEnable设置为true,作用是开启自动创建topic功能,如果关闭这个,则需要手动创建topic才能对接rancher,生产环境也建议关闭掉

  1. helm install kafka -n kafka -f values-production.yaml --set persistence.enabled=false --set zookeeper.persistence.enabled=false --set metrics.kafka.enabled=false --set metrics.jmx.enabled=false --set zookeeper.metrics.enabled=false --set autoCreateTopicsEnable=true .

执行完helm install后会输出以下内容

  1. NAME: kafka
  2. LAST DEPLOYED: Wed Nov 25 18:49:35 2020
  3. NAMESPACE: kafka
  4. STATUS: deployed
  5. REVISION: 1
  6. TEST SUITE: None
  7. NOTES:
  8. ** Please be patient while the chart is being deployed **
  9. Kafka can be accessed by consumers via port 9092 on the following DNS name from within your cluster:
  10. kafka.kafka.svc.cluster.local
  11. Each Kafka broker can be accessed by producers via port 9092 on the following DNS name(s) from within your cluster:
  12. kafka-0.kafka-headless.kafka.svc.cluster.local:9092
  13. kafka-1.kafka-headless.kafka.svc.cluster.local:9092
  14. kafka-2.kafka-headless.kafka.svc.cluster.local:9092
  15. You need to configure your Kafka client to access using SASL authentication. To do so, you need to create the 'kafka_jaas.conf' and 'client.properties' configuration files by executing these commands:
  16. - kafka_jaas.conf:
  17. cat > kafka_jaas.conf <<EOF
  18. KafkaClient {
  19. org.apache.kafka.common.security.scram.ScramLoginModule required
  20. username="user"
  21. password="$(kubectl get secret kafka-jaas -n kafka -o jsonpath='{.data.client-passwords}' | base64 --decode | cut -d , -f 1)";
  22. };
  23. EOF
  24. - client.properties:
  25. cat > client.properties <<EOF
  26. security.protocol=SASL_PLAINTEXT
  27. sasl.mechanism=SCRAM-SHA-256
  28. EOF
  29. To create a pod that you can use as a Kafka client run the following commands:
  30. kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:2.6.0-debian-10-r57 --namespace kafka --command -- sleep infinity
  31. kubectl cp --namespace kafka /path/to/client.properties kafka-client:/tmp/client.properties
  32. kubectl cp --namespace kafka /path/to/kafka_jaas.conf kafka-client:/tmp/kafka_jaas.conf
  33. kubectl exec --tty -i kafka-client --namespace kafka -- bash
  34. export KAFKA_OPTS="-Djava.security.auth.login.config=/tmp/kafka_jaas.conf"
  35. PRODUCER:
  36. kafka-console-producer.sh \
  37. --producer.config /tmp/client.properties \
  38. --broker-list kafka-0.kafka-headless.kafka.svc.cluster.local:9092,kafka-1.kafka-headless.kafka.svc.cluster.local:9092,kafka-2.kafka-headless.kafka.svc.cluster.local:9092 \
  39. --topic test
  40. CONSUMER:
  41. kafka-console-consumer.sh \
  42. --consumer.config /tmp/client.properties \
  43. --bootstrap-server kafka.kafka.svc.cluster.local:9092 \
  44. --topic test \
  45. --from-beginning

可以看到,已经在k8s集群中创建了3个节点的kafka集群

2、创建kafka client端

由于设置了sasl认证,所以需要创建client.propertieskafka_jaas.conf两个文件,并拷贝到client端,client端使用这两个配置文件才能对kafka集群进行相关操作

创建kafka_jaas.conf

  1. cat > kafka_jaas.conf <<EOF
  2. KafkaClient {
  3. org.apache.kafka.common.security.scram.ScramLoginModule required
  4. username="user"
  5. password="$(kubectl get secret kafka-jaas -n kafka -o jsonpath='{.data.client-passwords}' | base64 --decode | cut -d , -f 1)";
  6. };
  7. EOF

创建kafka_jaas.conf

  1. cat > kafka_jaas.conf <<EOF
  2. KafkaClient {
  3. org.apache.kafka.common.security.scram.ScramLoginModule required
  4. username="user"
  5. password="$(kubectl get secret kafka-jaas -n kafka -o jsonpath='{.data.client-passwords}' | base64 --decode | cut -d , -f 1)";
  6. };
  7. EOF

拷贝到client端内

  1. kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:2.6.0-debian-10-r57 --namespace kafka --command -- sleep infinity
  2. kubectl cp --namespace kafka client.properties kafka-client:/tmp/client.properties
  3. kubectl cp --namespace kafka kafka_jaas.conf kafka-client:/tmp/kafka_jaas.conf

3、Rancher对接Kafka

SASL认证,只支持通过broker连接入口,所以需要配置broker相关参数

kafka配置

访问端点类型:选择Broker

访问地址:填写kafka serviceIP地址,这里填写http://kafka.kafka:9092

主题:日志发送的主题

SSL配置

如果SASL类型为Scram,则不用配置SSL,反之当SASL类型为Plain时,需要配置SSL

SASL配置

用户名:默认是user,可以在values.yaml中,通过配置auth.jaas.clientUsers修改

密码:默认是随机值,可以通过kubectl get secret kafka-jaas -n kafka -o jsonpath='{.data.client-passwords}' | base64 --decode | cut -d , -f 1这个命令查看,另外也可以通过配置auth.jaas.clientPasswords来修改

类型:Scram

安全机制:sha256


点击测试按钮,等待结果返回验证通过后,点击保存按钮,Rancher会在System项目下创建相应的fluentd工作负载,到这里日志对接基本没问题了

4、验证效果

通过kafka-client查看日志是否对接成功

进入kafka-client pod bash环境

  1. kubectl exec -it kafka-client -n kafka -- bash

由于开启了认证,需要export相关环境变量

最后通过kafka-console-consumer.sh命令查看日志是否发送过来了

  1. export KAFKA_OPTS="-Djava.security.auth.login.config=/tmp/kafka_jaas.conf"
  2. kafka-console-consumer.sh --consumer.config /tmp/client.properties --bootstrap-server kafka.kafka.svc.cluster.local:9092 --topic rancher --from-beginning

效果如下:

kafka-client相关命令

查看topic 列表

  1. kafka-topics.sh --zookeeper kafka-zookeeper:2181 --list

创建topic

  1. kafka-topics.sh --zookeeper kafka-zookeeper:2181 --topic rancher --create --partitions 1 --replication-factor 1

删除topic

  1. kafka-topics.sh --delete --zookeeper kafka-zookeeper:2181 --topic test

如果delete.topic.enable=true,则会直接删除topic,如果delete.topic.enable=false,则只是把这个 topic 标记为删除(marked for deletion),重启 Kafka Server 后删除

生产者生产数据

  1. kafka-console-producer.sh --producer.config /tmp/client.properties --broker-list kafka-0.kafka-headless.kafka.svc.cluster.local:9092,kafka-1.kafka-headless.kafka.svc.cluster.local:9092,kafka-2.kafka-headless.kafka.svc.cluster.local:9092 --topic rancher

消费者消费生产者的数据

  1. kafka-console-consumer.sh --consumer.config /tmp/client.properties --bootstrap-server kafka.kafka.svc.cluster.local:9092 --topic rancher --from-beginning

kafka对接Rancher日志的更多相关文章

  1. spark读取 kafka nginx网站日志消息 并写入HDFS中(转)

    原文链接:spark读取 kafka nginx网站日志消息 并写入HDFS中 spark 版本为1.0 kafka 版本为0.8 首先来看看kafka的架构图 详细了解请参考官方 我这边有三台机器用 ...

  2. scribe、chukwa、kafka、flume日志系统对比

    scribe.chukwa.kafka.flume日志系统对比   1. 背景介绍许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理 这些日志需要特定的日志系统,一 ...

  3. 项目01-flume、kafka与hdfs日志流转

    项目01-flume.kafka与hdfs日志流转 1.启动kafka集群 $>xkafka.sh start 3.创建kafka主题 kafka-topics.sh --zookeeper s ...

  4. 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考

    本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...

  5. Kafka学习笔记之Kafka自身操作日志的清理方法(非Topic数据)

    0x00 概述 本文主要讲Kafka自身操作日志的清理方法(非Topic数据),Topic数据自己有对应的删除策略,请看这里. Kafka长时间运行过程中,在kafka/logs目录下产生了大量的ka ...

  6. ELK+Kafka集群日志分析系统

    ELK+Kafka集群分析系统部署 因为是自己本地写好的word文档复制进来的.格式有些出入还望体谅.如有错误请回复.谢谢! 一. 系统介绍 2 二. 版本说明 3 三. 服务部署 3 1) JDK部 ...

  7. 【转载】scribe、chukwa、kafka、flume日志系统对比

    原文地址:http://www.ttlsa.com/log-system/scribe-chukwa-kafka-flume-log-system-contrast/ 1. 背景介绍许多公司的平台每天 ...

  8. logstash redis kafka传输 haproxy日志

    logstash 客户端收集 haproxy  tcp日志 input { file { path => "/data/haproxy/logs/haproxy_http.log&qu ...

  9. scribe、chukwa、kafka、flume日志系统对比 -摘自网络

    1. 背景介绍许多公司的平台每天会产生大量的日志(一般为流式数据,如,搜索引擎的pv,查询等),处理这些日志需要特定的日志系统,一般而言,这些系统需要具有以下特征:(1) 构建应用系统和分析系统的桥梁 ...

随机推荐

  1. Java nio Server端示例

    public class ServerNio { public static void main(String[] args) throws IOException, InterruptedExcep ...

  2. Spring源码分析之`BeanFactoryPostProcessor`调用过程

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...

  3. c++ 让你的应用支持相对路径

    std::string GetCurrentExeDir(){ char szPath[1024] = { 0 };#ifdef WIN32 GetModuleFileName(NULL, szPat ...

  4. 使用阿里云镜像仓库构建国外 Docker 镜像

    使用阿里云镜像仓库下载国外镜像 在日常使用 Docker 或 K8S 的过程中,经常会需要到国外的网站中下载镜像,但是有些网站在国内是无法访问的.对于这个问题可以使用阿里云提供的镜像仓库进行下载,然后 ...

  5. 在国内使用Google验证码reCaptcha

    如今各大网站都不可缺少的一部分就是验证码,验证码具有防止恶意批量操作,保护账户安全等作用.但是现在各种暴力破解验证码的手段层出不穷,验证码的保护也就失去了意义.所以各大平台为了应对这种情况也是使用类似 ...

  6. 史上最全的Kuberenetes 常用命令手册

    1.0 k8s 集群状态检查 # 查看集群信息 kubectl cluster-info systemctl status kube-apiserver systemctl status kubele ...

  7. Redis中的一致性哈希问题

    在说redis中的哈希(准确来说是一致性哈希)问题之前,先来看一个问题:为什么在分布式集群中一致性哈希会得到大量应用? 在一个分布式系统中,要将数据存储到具体某个节点,或者将来自客户端的请求分配到某个 ...

  8. 前端之旅一:vscode调试web配置

    vscode调试web配置 第一步:安装vscode,并启动(vscode的安装包自行到其官网上下载) 第二步:在vscode上安装chrome插件 第三步:配置,启动调试 配置信息 { // Use ...

  9. How to using code find the menu label of Menus【X++】

    // VAR Changed by Xie Yu Fan.Fandy 谢宇帆 static void XIE_FindMenu(Args _args) { Dialog dlg = new Dialo ...

  10. Android Google官方文档解析之——Application Fundamentals

    Android apps are written in the java programming language.The Android SDK tools compile your code-al ...