如何暴露DaemonSet服务供同节点Pod调用?服务网格配置问询
实现基于DaemonSet的服务网格代理部署方案
看起来你已经朝着正确的方向推进了!我来帮你把配置补全、拆解细节,确保完全达成你的三个核心目标:
1. 服务网格Pod的DaemonSet部署与外部访问限制
首先,我们需要确保服务网格代理以DaemonSet形式在每个节点上运行,同时严格限制外部访问。
DaemonSet核心配置
创建一个DaemonSet,确保每个符合条件的节点都运行一个代理副本:
apiVersion: apps/v1 kind: DaemonSet metadata: name: service-mesh-proxy namespace: service-mesh spec: selector: matchLabels: app: service-mesh-proxy template: metadata: labels: app: service-mesh-proxy spec: containers: - name: proxy image: your-service-mesh-proxy-image:latest # 替换为你的代理镜像 ports: - containerPort: 8080 # 代理内部监听端口 resources: limits: memory: "128Mi" cpu: "100m" requests: memory: "64Mi" cpu: "50m" # 可选:仅在特定节点部署(比如Linux节点) nodeSelector: kubernetes.io/os: linux
限制外部访问的Service配置
为代理创建ClusterIP类型的Service(Kubernetes默认类型),这样只有集群内部Pod能访问,外部无法直接触及:
apiVersion: v1 kind: Service metadata: name: service-mesh-proxy-svc namespace: service-mesh spec: selector: app: service-mesh-proxy ports: - port: 8080 targetPort: 8080
注意:不要使用NodePort或LoadBalancer类型的Service,否则会暴露到集群外部。
2. 应用Pod配置同节点代理作为HTTP代理
你已经开始在Deployment中添加配置了,这里提供两种可靠的实现方式,确保应用请求全部走同节点的代理:
方式一:利用拓扑感知路由+服务名称(推荐)
如果你的Kubernetes集群开启了TopologyAwareHints(1.21+版本支持,默认可能开启),可以通过Service名称访问代理,Kubernetes会自动优先路由到同节点的代理Pod。同时添加Pod亲和性,强制应用和代理调度到同一节点:
apiVersion: apps/v1 kind: Deployment metadata: name: your-app namespace: default spec: replicas: 3 selector: matchLabels: app: your-app template: metadata: labels: app: your-app spec: containers: - name: app-container image: your-app-image:latest env: # 设置HTTP/HTTPS代理为集群内的代理服务 - name: HTTP_PROXY value: "http://service-mesh-proxy-svc.service-mesh.svc.cluster.local:8080" - name: HTTPS_PROXY value: "http://service-mesh-proxy-svc.service-mesh.svc.cluster.local:8080" # 排除内部地址不需要代理 - name: NO_PROXY value: "localhost,127.0.0.1,.cluster.local" # 强制应用Pod与同节点的代理Pod调度在一起 affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - service-mesh-proxy topologyKey: "kubernetes.io/hostname"
方式二:直接通过节点IP访问代理(无需拓扑感知)
如果集群没开启拓扑感知路由,可以让代理监听节点的端口,然后应用通过节点IP访问:
- 先修改DaemonSet,添加
hostPort让代理监听节点端口:
# 在DaemonSet的container ports中添加 ports: - containerPort: 8080 hostPort: 8080 # 代理监听节点的8080端口
- 然后在应用Deployment中注入节点IP,设置代理:
# 在应用容器的env中添加 - name: NODE_IP valueFrom: fieldRef: fieldPath: status.hostIP - name: HTTP_PROXY value: "http://$(NODE_IP):8080" - name: HTTPS_PROXY value: "http://$(NODE_IP):8080" - name: NO_PROXY value: "localhost,127.0.0.1,.cluster.local"
3. 验证配置是否生效
完成配置后,你可以通过以下步骤验证:
- 检查DaemonSet状态:
kubectl get daemonset -n service-mesh,确保每个节点都有一个Running的代理Pod。 - 检查应用代理配置:进入应用Pod执行
echo $HTTP_PROXY,确认代理地址正确;再用curl http://example.com,查看代理Pod的日志是否有请求记录。 - 验证外部访问限制:尝试从集群外访问节点的8080端口(如果用了方式二),确保无法连接;如果用方式一,ClusterIP服务本身就不会暴露到外部,无需额外验证。
内容的提问来源于stack exchange,提问作者Tomas Aschan
相关产品推荐
相关产品推荐

