我们通过设置单个节点Kafka 群集开始本系列的第一部分,该群集仅对同一 Kubernetes 群集中的内部客户端可以访问,没有加密、身份验证或授权,并且使用了临时持久性。在这个博客系列中,我们将继续对此进行跟踪/改进。
本部分将介绍以下主题:
- 将 Kafka 群集公开到外部应用程序
- 应用
TLS
加密 - 探索库伯内特在幕后的资源
- 使用 Kafka CLI 和 Go 客户端应用程序来测试我们的群集设置
该代码可在 GitHub – https://github.com/abhirockzz/kafka-kubernetes-strimzi/
我需要什么来尝试这个?
kubectl
– https://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 部分的原始清单
规格:
卡夫卡:
版本2.4.0
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.0。162.98 40.119.233.2 9094:31860/TCP60s
4
我的-卡夫卡-集群-卡夫卡-引导集群IP 10.0。200.20 <无> 9091/TCP,9092/TCP 60s
我的-kafka-群集-kafka-brokers经纪商集群无None<无> 9091/TCP,9092/TCP 60s
6
我的-卡夫卡-集群-卡夫卡-外部-引导负载平衡器10.0。122.21120.44.239.2029094:32267/TCP60s
7
我的-卡夫卡-集群-动物园管理员-client客户端集群IP 10.0。137.33 <无> 2181/TCP82s
我的-kafka-群集-动物园管理员-节点群集无None <无> 2181/TCP,2888/TCP,3888/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区域e。g东南 -
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
侦听器。安全。协议。地图+复制-9091:SSL,平原-9092:纯文本,外部-9094:SSL
请注意,除了代理间复制(通过端口 9091
)和未加密的内部(在 Kubernetes 群集内)客户端访问通过非 TLS
9092
端口,已添加适当的侦听器配置的 TLS 加密访问端口9094
真理的时刻...
为了确认,让我们尝试几个客户端应用程序,这将与我们新铸造的卡夫卡集群在库伯内特通信!我们将使用以下方法生成和使用消息:
- 卡夫卡 CLI(控制台)生产者和消费者
- 转到应用程序(使用汇流卡夫卡 Go 客户端)
必须加密与卡夫卡群集的通信(非 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.crt
和 ca.password
。随时查看其内容
而一些卡夫卡客户(e汇流 Go 客户端) 直接使用 CA 证书,其他(例如 Java 客户端、Kafka CLI 等)要求通过 访问 CA 证书 truststore
。我使用的内置, truststore
附带的JDK(Java)安装 - 但这只是为了方便,你可以自由地使用其他选项(如创建自己的)
Java
x
1
15
导出CERT_FILE_PATH=ca。crt
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=os。Getenv("CA_CERT_LOCATION")
3
主题=os。Getenv("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_ip:9094e。g42.42.424.424:9094
导出CA_CERT_LOCATION=替换为到careplace 的路径。您下载file的youcrt文件|
3
导出KAFKA_TOPIC+测试-条纹-主题
4
5
去运行卡夫卡客户端。去
您应该看到与此类似的日志,并确认正在生成和使用消息
按 ctrl+c
退出应用程序
Java
X
1
11
1
开始消费
2
开始生产者交付去例程
开始制作人戈例程
4
已传递的消息测试-条纹-主题=0= strimzi
5
传递的消息测试test-条纹 -strimzi主题=0=
6
传递的消息测试--条纹 -主题-=0=
7
收到来自测试test的消息 -strimzi-主题[0]值-2020-06-08 1616:23:05
020529419
8
收到来自测试test的消息 -strimzi-主题[0]值-2020-06-08 1616:23:07.915252=0530ISTm=2.022455867
9
收到来自测试fromtest的消息 -strimzi-主题[0]值-2020-06-08 1616:23:09.915875=0530ISTm=4.023055601
10
收到来自测试test的消息 -strimzi-主题[0]值-2020-06-08 1616:23:11
023134961
11
....
这就是现在的一切, 但有更多的来!
所以我们取得了一些进展!我们现在在 Kubernetes 上有一个 Kafka 群集, 这是可公开访问的, 但由于 Tls 加密, 它 (部分) 是安全的。我们还使用不是一个,而是两个(不同的)客户端应用程序,做了一些理智测试。下一部分,我们将进一步改进这一点...敬请期待!
Comments are closed.