集群外部无法通过 NodePort 方式访问 Prometheus 的 Web UI

在k8s中Prometheus 服务的 NodePort 已经正确配置,但集群外部无法通过 NodePort 方式访问 Prometheus 的 Web UI(集群使用了网络插件Calico)。

排查一:

在集群宿主机进行测试:

kubectl describe svc prometheus-k8s -n monitoring 

从输出结果来看,服务 prometheus-k8s 已经正确配置了两个端口:一个是用于 Web 端口的 9090(NodePort 为 32148),另一个是用于重新加载 Web 端口的 8080(NodePort 为 31109);

然后执行:

curl -L http://<node-ip>:<nodeport>

成功获取了Prometheus Web UI 的 HTML 页面。这表明集群内部可以通过 NodePort 访问 Prometheus 的 Web UI,可以排除 Prometheus Pod 和 Service 的基本配置问题,因为集群内部可以成功访问;

排查二:

尝试从集群的另一个一个节点使用 curl 直接访问 NodePort 服务,显示连接超时;这说明有可能是集群主机上的防火墙规则未允许外部流量到达 Prometheus 的 NodePort,需要手动添加规则以允许 TCP 流量通过端口。

解决方案一:

我的主机节点之前就已经把防火墙(firewalld)关了,需要重新开启,然后在开放防火墙端口:

########################
# master节点防火墙设置
########################

# 所有master节点开放相关防火墙端口
$ firewall-cmd --z
<think>嗯,用户想在Kubernetes上部署Kafka,并且需要启用SALA认证,同时还要配置NodePort以便外部访问。首先,我得确认用户提到的“SALA认证”是否正确,可能是拼写错误,通常Kafka使用的是SASL认证。所以可能需要先澄清这一点,但考虑到用户可能打错了,这里假设是SASL。 接下来,我需要回忆Kafka在Kubernetes上的部署方式。通常会用StatefulSet来管理Kafka的Pod,因为Kafka是有状态的应用,需要稳定的网络标识和持久化存储。然后,认证部分,SASL需要配置Kafka的broker,可能还需要Zookeeper的认证,不过现在新版本的Kafka可能已经不需要Zookeeper了?比如Kafka 2.8之后移除了Zookeeper,但用户可能还在使用旧版本,所以可能需要同时处理Zookeeper的部署和认证。 然后,SASL认证有多种机制,比如PLAIN、SCRAM等,用户可能需要生成相应的用户和密码,并创建Kubernetes Secret来存储这些凭证。同时,Kafka的配置文件需要启用SASL,并指定机制。可能需要为每个broker配置监听器,包括内部和外部访问的配置,因为NodePort会暴露节点端口,外部客户端需要通过这个端口访问,而内部通信可能使用其他端口。 关于NodePort的配置,用户需要Service的类型为NodePort,并且指定端口映射。这里需要注意的是,Kafka通常使用9092端口,但NodePort会映射到一个高位端口(30000-32767),所以外部访问时需要指定这个NodePort。同时,如果启用了SASL,客户端也需要配置相应的认证信息,比如用户名、密码和协议。 另外,安全性方面,可能需要考虑TLS加密,但用户的问题中没有提到,所以可能暂时不需要配置,但最好在回答中提到可选步骤。存储方面,需要确保StatefulSet使用持久卷来保存数据,避免Pod重启后数据丢失。 然后,应用案例部分可能需要提供一个测试方法,比如使用kafkacat或者Kafka客户端进行验证,确保消息可以生产和消费。同时,需要检查NodePort是否正确暴露,并且网络策略允许外部流量进入集群的节点端口。 可能遇到的问题包括:SASL配置错误导致broker启动失败,NodePort端口未开放导致外部无法访问,或者客户端配置不正确无法通过认证。需要确保所有步骤中的配置文件正确,Secret正确挂载,以及Service配置正确。 最后,生成相关问题时要覆盖部署的其他方面,比如监控、性能优化、高可用配置,以及与其他服务的集成,比如Prometheus监控或者与数据库的联动。</think>### 在Kubernetes中部署Kafka并配置SASL认证与NodePort外部访问 #### 一、部署Kafka基础环境 1. **创建命名空间与存储配置** ```yaml apiVersion: v1 kind: Namespace metadata: name: kafka --- apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: kafka-storage provisioner: rancher.io/local-path volumeBindingMode: WaitForFirstConsumer ``` 2. **使用StatefulSet部署Kafka** ```yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: kafka namespace: kafka spec: serviceName: kafka-headless replicas: 3 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: bitnami/kafka:3.4.0 env: - name: KAFKA_CFG_LISTENERS value: "SASL_PLAINTEXT://:9092" - name: KAFKA_CFG_ADVERTISED_LISTENERS value: "SASL_PLAINTEXT://$(POD_NAME).kafka-headless.kafka.svc.cluster.local:9092" volumeMounts: - name: data mountPath: /bitnami/kafka volumeClaimTemplates: - metadata: name: data spec: storageClassName: kafka-storage accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi ``` #### 二、配置SASL认证 1. **创建认证凭证Secret** ```bash kubectl create secret generic kafka-sasl-secret --namespace=kafka \ --from-file=client-passwords=./kafka_users_jaas.conf ``` 2. **修改Kafka环境变量** ```yaml env: - name: KAFKA_CFG_SASL_ENABLED_MECHANISMS value: "PLAIN" - name: KAFKA_CLIENT_USERS value: "admin,user" - name: KAFKA_CLIENT_PASSWORDS value: "admin-secret,user-secret" - name: KAFKA_OPTS value: "-Djava.security.auth.login.config=/opt/bitnami/kafka/config/kafka_jaas.conf" ``` #### 三、配置NodePort外部访问 1. **创建NodePort Service** ```yaml apiVersion: v1 kind: Service metadata: name: kafka-external namespace: kafka spec: type: NodePort ports: - name: sasl port: 9092 targetPort: 9092 nodePort: 31092 selector: app: kafka ``` 2. **验证端口开放状态** ```bash kubectl get svc -n kafka # 输出应包含: # kafka-external NodePort 10.98.45.12 <none> 9092:31092/TCP ``` #### 四、客户端连接验证 ```bash kafkacat -b <NODE_IP>:31092 -X security.protocol=SASL_PLAINTEXT \ -X sasl.mechanism=PLAIN -X sasl.username=admin -X sasl.password=admin-secret -L ``` ### 关键配置说明 1. **SASL认证机制**:使用PLAIN认证时需注意明文传输风险,生产环境建议结合SSL加密[^1] 2. **NodePort限制**:Kubernetes默认NodePort范围为30000-32767,需确保端口未被占用[^2] 3. **网络策略**:需配置NetworkPolicy允许外部流量进入 ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: kafka-external-access namespace: kafka spec: podSelector: matchLabels: app: kafka ingress: - ports: - protocol: TCP port: 9092 ``` ### 典型应用场景 - **物联网数据管道**:通过NodePort暴露Kafka服务接收设备数据 - **跨集群数据同步**:配置SASL认证保障跨集群通信安全 - **混合云架构**:结合云服务商的负载均衡器实现高可用访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值