You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何暴露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访问:

  1. 先修改DaemonSet,添加hostPort让代理监听节点端口:
# 在DaemonSet的container ports中添加
ports:
- containerPort: 8080
  hostPort: 8080 # 代理监听节点的8080端口
  1. 然后在应用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:59:50