跳到主要内容

Pod 通信

2024年12月03日
柏拉文
越努力,越幸运

一、认识


DaemonSet 是一种特殊的控制器,通常用于在每个节点运行系统级别的任务,例如日志收集、监控、网络配置等。DaemonSet 中的 Pod 可能需要与集群中的其他 Pod 通信,例如从工作负载 Pod 收集日志,或者向应用程序 Pod 发送指标或配置更新。

二、使用集群内的 DNS 服务


2.1 认识

DaemonSet 中的 Pod 与目标 Pod 需要通过服务发现实现通信时,可以通过 KubernetesDNS 服务。

2.2 实现

一、创建 Service:为目标 Pod 创建一个 Service,使其可以被 DNS 服务解析

apiVersion: v1
kind: Service
metadata:
name: app-service
namespace: default
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 8080
targetPort: 8080

二、DaemonSet 中的 Pod 使用 Service 进行通信: DaemonSet 中的 Pod 可以通过 app-service.default.svc.cluster.local 访问目标 Pod

三、直接使用 Node IP 和 HostPort


3.1 认识

DaemonSet 中的 Pod 运行在每个节点上,并需要直接访问节点上的其他服务时。

3.2 实现

一、在 DaemonSet 中使用 hostPort 暴露端口:

spec:
template:
spec:
containers:
- name: daemon-container
image: example/image
ports:
- containerPort: 8080
hostPort: 8080

二、其他 Pod 可以通过节点的 IP 地址和端口与 DaemonSetPod 通信

四、 使用 Kubernetes Service 和 Headless Service


4.1 认识

当需要对 DaemonSetPod 进行负载均衡或访问特定节点的 DaemonSet Pod 时。

4.2 实现

一、为 DaemonSet 创建一个普通的 Service,将所有 DaemonSet Pod 包含在其中

apiVersion: v1
kind: Service
metadata:
name: daemonset-service
spec:
selector:
app: daemon-app
ports:
- protocol: TCP
port: 8080
targetPort: 8080

二、使用 ClusterIP: None 创建 Headless Service,可以直接通过 DNS 访问特定节点的 Pod

apiVersion: v1
kind: Service
metadata:
name: daemonset-service
spec:
clusterIP: None
selector:
app: daemon-app