我们通过设置单个节点Kafka 群集开始本系列的第一部分,该群集仅对同一 Kubernetes 群集中的内部客户端可以访问,没有加密、身份验证或授权,并且使用了临时持久性。在这个博客系列中,我们将继续对此进行跟踪/改进。

本部分将介绍以下主题:

  • 将 Kafka 群集公开到外部应用程序
  • 应用 TLS 加密
  • 探索库伯内特在幕后的资源
  • 使用 Kafka CLI 和 Go 客户端应用程序来测试我们的群集设置

该代码可在 GitHub https://github.com/abhirockzz/kafka-kubernetes-strimzi/

我需要什么来尝试这个?

kubectlhttps://kubernetes.io/docs/tasks/tools/install-kubectl/

我将使用Azure Kubernetes 服务 (AKS)来演示这些概念,但一方面,它独立于 Kubernetes 提供程序(例如,随意使用本地设置,例如 minikube )。如果要使用 , AKS 只需要一个Microsoft Azure 帐户,如果您还没有该get for FREE帐户,可以免费获取该帐户。

我将不重复本系列本部分或后续部分中的某些常见部分(如头盔安装/安装、Strimzi、Azure Kubernetes 服务以及 Strimzi 概述),并要求您参考第一部分了解这些详细信息

让我们创建一个外部可访问的 Kafka 群集

为了达到这个目的,我们只需要稍微调整一下 Kafka Strimzi资源。我强调下面的关键部分 –这里是第 1 部分的原始清单

Java

 

 
1
规格
2
卡夫卡
3
版本2.4.0
4

5
侦听器
6
平原
7
外部
8
类型负载平衡器
9
tls真实

什么改变了?

为了使外部客户端应用程序可以访问 Kafka,我们添加了类型的 external 侦听器 loadbalancer 。由于我们将向公共 Internet 公开我们的应用程序,因此我们需要额外的保护层,如传输级别( TLS/SSL 加密)和应用程序级别安全性(身份验证和授权)。在这部分中,我们将只配置加密,并探索其他博客中的其他方面。要配置端到端 TLS 加密,我们添加tls: true

tls: true配置实际上用作默认值, 但为了清楚起见, 我显式添加了它

要创建群集:

Java

 

x
1
 
1
库布特尔应用-fhttps// github.com/abhirockzz/kafka-kubernetes-strimzi/raw/master/part-2/kafka.yaml

库伯内特魔法!

Strimzi 操作员开始行动,为我们执行所有繁重的工作:

  • 它创造了一个库伯内特请参阅第 1 部分

    如果您查找 Service s,您会看到类似这样的东西:

    Java

     

    x
    1

    1
    库布特尔得到getsvc
    2
    
    
    3
    我的-卡夫卡-集群-卡夫卡-0 负载平衡器10.0162.98 40.119.233.2 909431860/TCP60s
    4
    我的-卡夫卡-集群-卡夫卡-引导集群IP 10.0200.20 <> 9091/TCP9092/TCP 60s
    我的-kafka-群集-kafka-brokers经纪商集群无None<> 9091/TCP9092/TCP 60s

    6
    我的-卡夫卡-集群-卡夫卡-外部-引导负载平衡器10.0122.21120.44.239.202909432267/TCP60s
    7
    我的-卡夫卡-集群-动物园管理员-client客户端集群IP 10.0137.33 <> 2181/TCP82s
    我的-kafka-群集-动物园管理员-节点群集无None <> 2181/TCP2888/TCP3888/TCP 82s

    请注意类型的 my-kafka-cluster-kafka-external-bootstrap Service LoadBalancer ?由于我使用的是 Azure Kubernetes 服务,因此它由具有公共IP 的 Azure 负载均衡器提供支持( 20.44.239.202 在此示例中),通过端口向外部客户端公开 Kafka 9094 。您应该能够使用 Azure CLI(或 Azure 门户(如果您愿意) az network lb list 使用命令找到它

    Java

     

    x
    1

    1
    导出AKS_RESOURCE_GROUP=替换为with资源名称|
    2
    导出AKS_CLUSTER_NAME=替换为withAKS群集名称|
    3
    导出AKS_LOCATION=替换为with区域eg东南 -
    4
    
    
    5
    az网络列表-gMC_$AKS_RESOURCE_GROUP_$_AKS_CLUSTER_NAMEAKS_CLUSTER_NAME _$_ $_AKS_LOCATION]MC_$
    ConfigMap

    Java

     

    x
    1
     
    1
    导出CLUSTER_NAME=我的-卡夫卡-群集
    2
    kubectl获取配置图/CLUSTER_NAME$ CLUSTER_NAME+ -卡夫卡-配置-oyaml get/
    Java

     

    x
    1
     
    1
    = 复制 -9091//0.0.0.0.0:9091,PLAIN-9092://0.0.0.0.0.0.0:9092,EXTERNAL-9094/0.0.0.0:9094
    广告。听众=复制-9091//my-kafka-cluster-kafka-$=STRIMZI_BROKER_ID=.my-kafka-cluster-kafka-brokers.default.svc:9091,PLAIN-9092/my-卡夫卡集群-卡夫卡-$[STRIMZI_BROKER_ID].my-kafka-cluster-kafka-brokers.default.svc:9092,EXTERNAL-9094://$[STRIMZI_EXTERNAL_9094_ADVERTISED_HOSTNAME]:$[STRIMZI_EXTERNAL_9094_ADVERTISED_PORT]

    3
    侦听器安全协议地图+复制-9091SSL平原-9092纯文本外部-9094SSL

    请注意,除了代理间复制(通过端口 9091 )和未加密的内部(在 Kubernetes 群集内)客户端访问通过非 TLS 9092 端口,已添加适当的侦听器配置的 TLS 加密访问端口9094

    真理的时刻...

    为了确认,让我们尝试几个客户端应用程序,这将与我们新铸造的卡夫卡集群在库伯内特通信!我们将使用以下方法生成和使用消息:

    必须加密与卡夫卡群集的通信(非 TLS 客户端连接将被拒绝)为此,客户端应用程序需要信任群集 CA 证书。请记住,群集 CA 证书存储在 Kubernetes 中 Secret (请参阅第1 部分中的详细信息)。默认情况下,这些证书由 Strimzi 自动生成,但您也可以提供自己的证书(请参阅https://strimzi.io/docs/operators/master/using.html#kafka-listener-certificates-str )。

    首先提取群集 CA 证书和密码:

    Java

     

    x
    1
     
    1

    2
    
    
    3
    kubectlsecret获得$CLUSTER_name-get群集-ca-证书-ojsonpath="..data. ca_. crt"|| -base64--解码>ca.crt
    4
    kubectlget获取$CLUSTER_name-群集$CLUSTER_NAME--ca-证书-ojsonpath='.data.ca}. 密码} =base64--解码>ca.密码

    您应该有两个文件: ca.crtca.password 。随时查看其内容

    而一些卡夫卡客户(e汇流 Go 客户端) 直接使用 CA 证书,其他(例如 Java 客户端、Kafka CLI 等)要求通过 访问 CA 证书 truststore 。我使用的内置, truststore 附带的JDK(Java)安装 - 但这只是为了方便,你可以自由地使用其他选项(如创建自己的)

    Java

     

    x
    1
    15
     
    导出CERT_FILE_PATH=cacrt

    2
    导出CERT_PASSWORD_FILE_PATH=ca密码
    3
    
    
    4
    #将其this替换为the信任to存储的路径
    5
    
    
    6
    导出KEYSTORE_LOCATIONKEYSTORE_LOCATION\/Library/Java/Java 虚拟机器/jdk1.8.0_221.jdk/内容/security/首页/jre/lib/ 安全/卡塞特
    导出密码"猫$CERT_密码_文件_路径"

    8
    出口CA_CERT_ALIAS_strimzi-卡夫卡 -证书
    9
    
    
    10
    *theyou您将提示Jdkthe信任存储的信任存储密码, 默认密码"更改"
    11
    #键入yes是以响应tothe"信任此证书?[否]:'提示
    12
    
    
    sudo 键托 -导入证书 -$CA_CERT_ALIAS -文件 $CERT_FILE_PATH -密钥存储$KEYSTORE_位置 -$PASSWORD

    14
    
    
    15
    sudo键托 - 列表alias--名$CA_CERT_ALIAS-密钥存储$KEYSTORE_位置

    这就是基本设置 - 你准备尝试 Kafka CLI 客户端!

    请注意,下面详述的 Kafka CLI 的配置步骤也适合 Java 客户端 - 试一试!

    提取 LoadBalancer 卡夫卡群集的公共 IP

    Java

     

    x
    1

    1
    导出KAFKA_CLUSTER_NAME=我的-kafka-群集
    2
    
    
    3
    kubectlget获得服务/$$KAFKA_CLUSTER_NAME_-kafka-外部-引导-输出[jsonpath]==状态负载平衡器入口 =0= 。ip|

    创建包含以下内容 client-ssl.properties 的调用文件:

    Java

     

    x
    1

    1
    引导服务器\=os.Getenv"KAFKA_BOOTSTRAP_SERVERS"
    2
    caLocation=osGetenv"CA_CERT_LOCATION"
    3
    主题=osGetenv"KAFKA_TOPIC"
    4
    
    
    5
    配置+卡夫卡.ConfigMap="引导. 服务器"引导服务器"安全. 协议""Ssl""ssl. ca. location"calocation=

    请注意,bootstrap协议与在 Kafka CLI 客户端中使用的协议相同(Java 也相同)。唯一的区别 ssl.ca.location 是,用于直接指向 CA 证书,而不是truststore

    如果已 Go 安装,可以试用。克隆 Git 存储库...

    Java

     

    x
    1
     
    1
    git克隆https//github.com/abhirockzz/kafka-kubernetes-strimzi
    2

    ..并运行程序:

    Java

     

    x
    1
     
    1
    导出KAFKA_BOOTSTRAP_SERVERS==替换为withloadbalancer_ip9094eg42.42.424.4249094
    导出CA_CERT_LOCATION=替换为careplace 路径您下载fileyoucrt文件|

    3
    导出KAFKA_TOPIC+测试-条纹-主题
    4
    
    
    5
    运行卡夫卡客户端

    您应该看到与此类似的日志,并确认正在生成和使用消息

    ctrl+c 退出应用程序

    Java

     

    X
    1
    11
     
    1
    开始消费
    2
    开始生产者交付去例程
    开始制作人戈例程

    4
    传递的消息测试-条纹-主题=0=@122 strimzi
    5
    传递的消息测试test-条纹 -strimzi主题=0=#123
    6
    传递的消息测试--条纹 -主题-=0=#124
    7
    收到来自测试test的消息 -strimzi-主题[0]@122-2020-06-08 16162305

    020529419

    8
    收到来自测试test的消息 -strimzi-主题[0]@123-2020-06-08 16162307.915252=0530ISTm=2.022455867
    9
    收到来自测试fromtest的消息 -strimzi-主题[0]@124-2020-06-08 16162309.915875=0530ISTm=4.023055601
    10
    收到来自测试test的消息 -strimzi-主题[0]@125-2020-06-08 16162311

    023134961

    11
    ....

    这就是现在的一切, 但有更多的来!

    所以我们取得了一些进展!我们现在在 Kubernetes 上有一个 Kafka 群集, 这是可公开访问的, 但由于 Tls 加密, 它 (部分) 是安全的。我们还使用不是一个,而是两个(不同的)客户端应用程序,做了一些理智测试。下一部分,我们将进一步改进这一点...敬请期待!

    Comments are closed.