当前位置: 首页 > news >正文

在k8s中,如何实现服务的访问,k8s的ip是变化的,怎么保证能访问到我的服务

在K8S中,Pod的IP动态变化确实无法直接通过固定IP限制访问,但可以通过标签(Label)、服务(Service)和网络策略(NetworkPolicy)的组合,实现动态身份识别的访问控制,而非依赖固定IP。以下是核心解决方案:

一、通过标签去控制
 
一、核心逻辑:用标签替代IP做身份标识


 
1. 为Pod打标签(Label)
 
给允许访问的Pod和目标服务Pod分别添加唯一标签,例如:
 
- 允许访问的Pod: app: allowed-client 
 
- 清算服务Pod: app:清算-service 
 
2. NetworkPolicy基于标签匹配流量
 
K8S的NetworkPolicy支持通过标签选择器( podSelector / namespaceSelector )匹配Pod,而非固定IP。示例策略:
 
yaml
  
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-labeled-pods-to-清算服务
spec:
  podSelector:  # 目标服务(清算服务)的标签
    matchLabels:
      app: 清算-service
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:  # 允许访问的Pod标签
        matchLabels:
          app: allowed-client
    ports:
    - protocol: TCP
      port: 8080  # 目标端口
 
 
关键点:无论Pod IP如何变化,只要标签存在,策略始终生效。


 
二、通过Service抽象访问入口(避免直接访问Pod IP)


 
1. 为清算服务创建K8S Service
 
yaml
  
apiVersion: v1
kind: Service
metadata:
  name:清算-service
spec:
  selector:
    app: 清算-service  # 匹配服务Pod的标签
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
 
 
2. 客户端通过Service名称访问
 
允许的Pod通过 http://清算-service:8080 访问,而非直接访问Pod IP。Service会自动将请求路由到后端动态IP的Pod上,且NetworkPolicy可直接限制对Service的访问。


 
三、跨Node/Namespace的补充方案


 
1. Namespace隔离(标签+命名空间)
 
- 将清算服务与允许的Pod置于同一Namespace(如 finance ),并限制其他Namespace访问:
yaml
  
ingress:
- from:
  - namespaceSelector:  # 仅允许来自特定Namespace的流量
      matchLabels:
        environment: prod
    podSelector:
      matchLabels:
        app: allowed-client
 
 
2. Node节点标签(针对固定节点场景)
 
若清算服务固定在某些节点上,可给节点打标签(如 role:清算节点 ),并在Pod调度时指定节点:
 
yaml
  
spec:
  nodeSelector:
    role: 清算节点
 
 
结合NetworkPolicy限制仅允许的Pod调度到这些节点(需配合Taints/Tolerations)。


 
四、底层网络插件的支持


 
1. 使用支持动态IP的CNI插件
 
- Calico:支持基于标签的NetworkPolicy,直接匹配Pod标签,无需关心IP变化。
 
- Cilium:基于eBPF实现高效流量过滤,支持标签、ServiceAccount等多层级策略。
 
2. 避免使用依赖Pod IP的传统工具
 
如直接在云厂商VPC中绑定Pod IP到安全组(Security Group),因IP动态变化会导致策略失效。应优先通过K8S原生策略控制。


 
五、验证与动态调整


 
1. 实时查看策略生效情况
 
bash
  
# 检查清算服务Pod的入站流量策略
kubectl describe networkpolicy allow-labeled-pods-to-清算服务
 
 
2. 动态更新标签
 
如需新增允许访问的Pod,只需为其添加对应标签(如 app: allowed-client ),无需修改NetworkPolicy。
 
总结:K8S的流量控制本质
 
- 抛弃IP依赖:通过标签将“身份”与Pod绑定,策略随标签动态生效。
 
- 服务抽象层:Service作为稳定访问入口,屏蔽Pod IP变动的影响。
 
- 分层防护:上层用K8S标签策略,底层用云厂商VPC限制Namespace所在子网流量(可选),实现双重保障。
 
这种方案比传统IP+端口限制更灵活,完全适应K8S的动态调度特性,确保只有符合标签规则的Pod能访问目标服务。

二、除了NetworkPolicy还有哪些方法可以限制Pod的网络访问?

在K8S中,除了 NetworkPolicy ,还可以通过以下方法限制Pod的网络访问,这些方案适用于不同场景(如集群内外隔离、权限控制粒度、底层网络架构等):


 
一、基于服务账号(ServiceAccount)的网络限制


 
核心逻辑
 
通过K8S内置的 ServiceAccount (SA)关联权限,结合底层网络插件(如Calico/Cilium)实现基于身份的流量控制,而非IP/标签。
 
实现方式
 
1. 为Pod绑定特定SA
yaml
  
spec:
  serviceAccountName: allowed-client-sa  # 绑定SA
 
 
2. 网络插件中配置SA策略(以Calico为例)
yaml
  
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-sa-to-service
spec:
  source:
    serviceAccount: allowed-client-sa  # 允许来自该SA的流量
  destination:
    selector: app == '清算-service'
  service:
    port: 8080
    protocol: TCP
 
 
优势:SA可关联RBAC权限,实现“权限+网络”的双重控制,适合微服务间的身份验证场景。


 
二、通过Pod安全策略(PodSecurityPolicy,PSP,已废弃但兼容方案)


 
注意
 
PSP在K8S 1.21+已废弃,推荐使用Pod Security Admission(PSA)替代,但部分旧集群仍可使用。
 
限制方向
 
1. 禁止Pod使用宿主网络(HostNetwork)
yaml
  
spec:
  hostNetwork: false  # 禁止Pod共享节点网络栈
 
 
2. 限制Pod访问特定端口/协议
通过PSP的 allowedHostPorts 字段,仅允许Pod访问指定节点端口(需节点网络策略配合)。


 
三、基于网络插件的高级功能(如Calico/Cilium)


 
1. Calico的IP池与IPSet
 
- IP池隔离:将清算服务Pod划入独立IP池(如 10.244.1.0/24 ),允许访问的Pod通过标签匹配该池的IP段。
 
- IPSet动态组:将允许的Pod IP动态加入IPSet(类似动态安全组),策略直接引用IPSet名称:
bash
  
calicoctl create ipset name=allowed-clients type=set
# 自动将带标签的Pod IP加入IPSet
calicoctl apply -f - <<EOF
apiVersion: projectcalico.org/v3
kind: HostEndpoints
metadata:
  name: client-pod-1
spec:
  node: node1
  ipAddresses: ["192.168.1.1"]
  labels:
    app: allowed-client
  ipSets: ["allowed-clients"]  # 关联IPSet
EOF
 
 

2. Cilium的身份标识(Endpoint ID)


 
- Cilium为每个Pod分配唯一的 Endpoint ID ,策略直接通过ID限制流量,完全脱离IP依赖:
yaml
  
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-endpoint-to-service
spec:
  endpointSelector: { matchLabels: {app: allowed-client} }  # 匹配Endpoint标签
  toEndpoints:
  - matchLabels: {app: 清算-service}
  rules:
  - allowedTo:
    - service: { port: "8080", protocol: TCP }


 
 
四、基于命名空间(Namespace)的网络隔离


 
1. 命名空间网络策略
 
在命名空间级别限制入站/出站流量,例如:
 
yaml
  
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: namespace-isolation
  namespace: finance  # 仅作用于finance命名空间
spec:
  podSelector: {}  # 匹配命名空间内所有Pod
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - namespaceSelector:  # 仅允许来自prod命名空间的流量
        matchLabels:
          environment: prod
 
 
2. 命名空间资源配额
 
通过 ResourceQuota 限制命名空间内Pod的网络资源(如带宽、连接数),间接控制访问频率。
 

五、云厂商原生网络方案


 
1. VPC网络策略(如AWS/GCP/Azure)
 
- 将K8S集群的Node节点划入VPC子网,通过云厂商的**安全组(Security Group)或网络安全组(NSG)**限制Pod所在子网的流量。
 
- 注意:需结合K8S的Node标签,将清算服务Pod固定调度到特定子网的Node上,再通过VPC策略限制仅允许的子网访问。
 
2. 阿里云Terway/腾讯云CCN
 
使用云厂商定制的CNI插件,直接在VPC层为Pod分配弹性IP(ENI),结合云厂商的ACL(访问控制列表)实现IP级流量控制(需Pod IP固定)。


 
六、基于服务网格(Service Mesh)的流量治理


 
代表方案:Istio/Linkerd
 
1. 基于身份的流量控制
通过Istio的 ServiceEntry 和 DestinationRule ,根据Pod的服务身份(如 cluster.local/ns/finance/svc/清算-service )限制访问:
yaml
  
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-client-to-service
spec:
  selector:
    matchLabels:
      app: 清算-service
  action: ALLOW
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/client/ServiceAccount/allowed-client-sa"]
    to:
    - operation:
        ports: ["8080"]
 
 
2. TLS双向认证(mTLS)
强制要求客户端Pod与清算服务通过证书认证后才能通信,防止未授权流量接入。


 
七、总结:方案对比与选型建议


 
表格
  
方案 核心维度 适用场景 动态性 复杂度 
NetworkPolicy 标签/命名空间 集群内细粒度流量控制 高 中 
ServiceAccount+网络策略 身份+权限绑定 微服务间需RBAC联动的场景 高 高 
云厂商VPC策略 底层网络隔离 跨集群或混合云环境 低(需固定Node) 低 
服务网格 协议/认证/流量治理 复杂微服务架构,需mTLS/熔断等 高 极高 
Calico/Cilium高级特性 原生插件深度集成 大规模集群,需IPSet/Endpoint ID等 高 中 
 
建议优先级:
 
1. 优先使用 NetworkPolicy 实现集群内标签级控制;
 
2. 需身份认证时结合 ServiceAccount +插件策略;
 
3. 跨集群或云环境使用VPC+Node调度;
 
4. 复杂场景(如多协议、mTLS)引入服务网格。

相关文章:

  • Perspective,数据可视化的超级引擎!
  • K8S常见问题汇总
  • PDF生成模块开发经验分享
  • [5-2] 对射式红外传感器计次旋转编码器计次 江协科技学习笔记(38个知识点)
  • XL32F001国产低成本单片机,24MHz主频,24KB Flash,3KB SRAM
  • 【探寻C++之旅】第十三章:红黑树
  • Python Cookbook-7.8 使用 Berkeley DB 数据库
  • TensorFlow 2.x入门实战:从零基础到图像分类项目
  • 物流无人机自动化装卸技术解析!
  • Python在自动驾驶实时数据处理中的应用:让AI驾驶更智能、更高效
  • Python奶茶系统
  • 能耗优化新引擎:EIOT平台助力企业降本增效
  • Redis实现分布式获取全局唯一自增ID的案例。
  • 二极管的动态特性
  • 如何设置内网映射端口到外网访问?哪些软件可以进行端口映射?
  • 多级路由器如何避免IP冲突
  • Go:简洁高效,构建现代应用的利器
  • VR博物馆,足不出户云逛展
  • Spring Security(笔记)
  • OPCUA,OPCDA与MODBUS学习笔记
  • 定位真核生物起源于约27.2亿年前,华东师大团队在《自然》发文
  • 对话|蓬皮杜策展人布莱昂:抽象风景中的中国审美
  • 公募基金解读“一揽子金融政策”:增量财政空间或打开,有助于维持A股活力
  • 湖南张家界警方公告宣布一名外国人居留许可作废
  • 马上评|持续对标国际一流,才有22项“全球最优”
  • 国家矿山安全监察局发布《煤矿瓦斯防治能力评估办法》