You need to enable JavaScript to run this app.
导航
集群网络安全最佳实践
最近更新时间:2025.03.25 18:01:18首次发布时间:2025.03.25 18:01:18
我的收藏
有用
有用
无用
无用

网络安全概述

容器服务集群中的网络安全措施,主要包括:流量管制和网络加密。VKE 集群中提供多种功能支持上述网络安全措施。如下表所示。

网络安全策略说明
流量管制指限制服务之间网络流量的规则。主要功能包括:网络策略和安全组。
网络加密指对传输中的流量进行加密。主要功能包括:入口控制器和负载均衡器、服务网格。

策略对比

使用场景

在集群中使用 Kubernetes 网络策略和安全组进行流量管制,适用于不同的场景,详情如下表所示。

安全策略使用场景

Kubernetes 网络策略

控制集群中 Pod 到 Pod 的流量。

  • 适用于管理集群内部 Pod 之间的通信(东西向流量)。
  • 在 IP 地址或端口级别(OSI 第 3 层或第 4 层)控制流量。

安全组

  • 利用现有的火山引擎网络隔离能力:如果您已通过复杂的安全组管理火山引擎上的服务访问权限,且正在将应用从 ECS 迁移到 VKE,安全组是理想选择。它允许复用现有安全组资源并应用到集群中,减少现有的网络架构改动。
  • 控制对火山引擎云服务的访问:当集群中的应用需要与其他火山引擎云服务。

关键区别

Kubernetes 网络策略和安全组的主要区别,如下表所示。

对比项Kubernetes 网络策略火山引擎 VPC 安全组
流量类型集群内部东西向流量控制 Pod 与 VPC 内资源(如 ECS、RDS)及公网的通信
控制层级OSI 第 3/4 层(IP/端口)基于火山引擎 VPC 安全组规则
适用场景微服务间隔离混合云架构或者和火山引擎云服务互访
生效范围集群内 PodVPC 内所有资源

网络策略(NetworkPolicy)

在 Kubernetes 集群中,默认情况下允许所有 Pod 到 Pod 的通信。尽管这种灵活性可能有助于降低网络复杂度,但它并不安全。Kubernetes 网络策略为您提供了一种机制,用于限制 Pod 之间的网络流量(通常称为 东西向流量)以及 Pod 和外部服务之间的网络流量。

Kubernetes 网络策略在 OSI 模型的第 3 层和第 4 层运行。网络策略使用 Pod、命名空间选择器和标签来识别源和目标 Pod,同时也可以包括 IP 地址、端口号、协议或这些内容的组合。网络策略可以应用于 Pod 的入站或出站连接,通常称为入口规则和出口规则。Kubernetes 网络策略需集群 CNI 插件支持,VKE 通过 VPC-CNI 插件原生集成此能力。

说明

仅 VPC-CNI 网络集群支持配置网络策略,Flannel 网络集群暂不支持。

借助 VPC-CNI 插件对原生网络策略的支持,您可以配置网络策略来保护 Kubernetes 集群中的网络流量。它与上游的 Kubernetes 网络策略 API 集成,可确保兼容和遵守 Kubernetes 标准。您可以使用上游 API 支持的不同 标识符 来定义策略。默认情况下,所有入口和出口流量都允许进入一个 Pod。当指定带有 PolicyType Ingress 的网络策略时,只有来自容器节点的连接和入口规则允许的连接才能连接到 Pod。同样适用于出口规则。如果定义了多条规则,则在做出决定时会考虑所有规则的并集,顺序不会影响整体策略结果。

注意

  • 邀测·申请试用】:网络策略(NetworkPolicy)功能目前处于邀测阶段,如需使用,请提交申请。
  • 更多网络策略配置方式,请参见 使用 NetworkPolicy 进行网络访问控制
  • VCI 暂不支持网络策略,请勿在包含了 VCI 的集群中使用网络策略。可能会导致系统服务不可用。

网络策略入门

当使用网络策略管控集群中的 Pod 流量时,常见的最佳实践是采用 最低权限原则,即首先禁止所有的 Pod 出站流量和入站流量,然后根据需求逐步放开指定的流量。实现集群中 Pod 流量的最小化原则。具体的操作流程,如下所示:

步骤一:创建默认拒绝策略

与 RBAC 策略一样,建议在网络策略中遵循最低权限访问原则。首先创建一个 全部拒绝 的策略,该策略限制命名空间中的所有入站和出站流量。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

步骤二:创建允许 DNS 查询的规则

当您配置了 全部拒绝 规则后,就可以开始对其他流量进行按需放行,例如允许 Pod 查询 CoreDNS 以获取名称解析。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-access
  namespace: default
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: UDP
      port: 53

步骤三:逐步添加规则以选择性地允许命名空间/容器之间的流量流动

了解应用程序要求并根据需要创建细粒度的入口和出口规则。本例中以只允许 client-app 访问 backend-app 的 80 端口为例,这有助于最大限度地减少攻击面并降低未经授权访问的风险。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress-backend
  namespace: default
spec:
  podSelector:
    matchLabels:
      k8s-app: backend-app
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          k8s-app: client-app
    ports:
    - protocol: TCP
      port: 80

推荐工具

当您配置和使用网络策略时,可以使用以下常见的工具,学习、编写和验证网络策略的正确性和有效性。

工具地址工具说明
https://networkpolicy.io/交互式的 Kubernetes 网络策略(NetworkPolicy)可视化编辑和学习工具。

https://orca.tufin.io/netpol/
https://editor.networkpolicy.io/

可视化编辑器,帮助您编写和测试网络策略。

https://github.com/ahmetb/kubernetes-network-policy-recipesGitHub 仓库,提供了大量 Kubernetes 网络策略示例,涵盖常见使用场景,如限制流量、隔离命名空间等。
https://kubernetes.io/docs/concepts/services-networking/network-policies/Kubernetes 官方文档,介绍了网络策略的基本概念、使用方法和示例。

安全组

安全组是火山引擎 VPC 提供的安全策略。安全组由一系列安全组规则组成,用于控制网卡的出入流量,每张网卡必须加入安全组。安全组基于白名单原理设计,故网卡的流量必须被安全组允许才会放通。

在容器服务中配置安全组的最佳实践,请参见 安全组配置最佳实践

服务网格

说明

火山引擎服务网格产品当前处于邀测中,如有使用需求,请联系您的客户经理。

什么是服务网格?

服务网格是专为应用程序设计的独立基础设施层。它允许透明地为应用添加可观测性、流量管理和安全能力,而无需修改业务代码。

  • 工作层级:服务网格的策略实施作用于 OSI 模型的第 7 层(应用层)(如 HTTP/gRPC)。
  • 常见工具:Istio、Linkerd 以及火山引擎 微服务引擎(MSE)(完美兼容 ISTIO)等。

何时使用服务网格进行策略实施?

说明

Istio 支持访问规则控制,具体操作方式,请参见 创建访问控制规则

  1. 已有服务网格技术投入:如果团队已部署服务网格(如 Istio),可复用其能力。
  2. 需要高级功能,包括:
    • 流量管理:负载均衡、熔断、限流、超时控制等。
    • 可观测性:获取服务性能的详细指标(延迟、错误率、QPS、请求量等)。
    • 安全增强:通过双向 TLS(mTLS)加密服务间通信。

说明

双向 TLS(mTLS, Mutual Transport Layer Security)是一种双向身份验证协议,通信双方(客户端与服务端)均需验证对方证书,确保双方身份合法。

双向 TLS 的主要作用包括:

  • 防止中间人攻击(如服务冒充)
  • 加密传输数据(如 API 请求内容)服务网格中的应用。

何时选择 Kubernetes 网络策略?

  1. 简单场景需求:仅需限制 Pod 之间的通信权限(如按命名空间或标签隔离)。
  2. 资源效率优先:网络策略的资源消耗远低于服务网格,适合小型集群或无需复杂流量控制的场景。

关键区别

使用 Kubernetes 网络策略和服务网格的主要区别,如下表所示。

特性Kubernetes 网络策略服务网格
工作层级OSI 第 3 层(网络层)和第 4 层(传输层)OSI 第 7 层(应用层)
核心能力基础网络隔离(IP/端口控制)高级流量管理、可观测性、安全增强
资源开销高(需部署 Sidecar 代理等组件)

说明

Kubernetes 网络策略和服务网格可协同使用,既能降低攻击面,又能实现精细化的应用层控制。

  • 基线安全隔离:使用网络策略为 Pod 提供基础的通信限制。
  • 增强能力叠加:通过服务网格补充流量管理、监控和安全功能(如 mTLS)。

网络加密

配置 HTTPS 类型的外部负载均衡器(Service 层)

配置 Service 时基于如下注解,能够快速部署 HTTPS 加密的负载均衡器。

注解字段字段类型示例值默认值说明
service.beta.kubernetes.io/volcengine-loadbalancer-protocol-portJSON"HTTP:80,HTTPS:443"定义负载均衡器监听的协议与端口(HTTP 用于自动重定向至 HTTPS)。
service.beta.kubernetes.io/volcengine-loadbalancer-cert-sourceString"clb""clb"指定证书来源为火山引擎负载均衡器(CLB),需提前在火山引擎控制台上传证书。
service.beta.kubernetes.io/volcengine-loadbalancer-cert-idStringcert-xxxxxx(实际证书ID)绑定已预配置的 HTTPS 证书,确保传输层加密。

说明

负载均衡服务的配置详情,请参考 使用 Annotation 配置负载均衡服务

方案优势:

  • 全链路加密:通过 HTTPS 保护用户到负载均衡器的流量,避免中间人攻击。
  • 自动化管理:集成火山引擎 CLB 的证书服务,支持证书自动续期与绑定。

配置 HTTPS 类型的 Ingress

通过 Ingress 资源实现七层路由的 HTTPS 加密,适用于复杂路由场景(如多域名、多路径)。

前提条件

配置步骤

使用如下 YAML 配置,创建 HTTPS 类型的 ALB Ingress。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress-demo # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
  annotations:
    ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号
    ingress.vke.volcengine.com/loadbalancer-protocol: "https"  # 监听器协议。本例中取值为 https
spec:
  ingressClassName: alb  # ALB Instance 的资源名称
  rules:
  - host: example.com  # 需要对外提供访问的域名
    http:
      paths:
      - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
        path: / # 请求匹配的路径
        backend:
          service:
            name: service-demo # 需要对接的服务名称
            port: 
              number: 80 # 需要对接服务的端口号

说明

更多 Ingress 配置详情,请参考 ALB Ingress 配置 HTTPS 协议

方案优势:

  • 统一入口加密:集中管理多服务的 HTTPS 流量,降低配置复杂度。
  • 灵活路由策略:支持按域名/路径分流,同时保障加密安全。

注意

  • 证书管理:定期轮换证书并监控有效期,避免因证书过期导致服务中断,推荐使用火山引擎证书中心托管 SSL 证书。
  • 混合协议场景:若需同时支持 HTTP 和 HTTPS,建议通过protocol-port注解配置自动重定向(HTTP > HTTPS)。

在服务网格中配置 mTLS

在 Istio 中管理 TLS 版本时,若需去掉证书管理部分(如证书生成、更新等),可通过以下方式直接配置 TLS 协议版本。

全局配置最低 TLS 版本

通过 Istio 的安装配置文件IstioOperator指定全局最低 TLS 协议版本。例如,强制所有工作负载使用 TLS 1.3 及以上版本。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    meshMTLS:
      minProtocolVersion: TLSv1_3

此配置会在Istio控制平面安装时生效,所有服务通信将仅支持 TLS 1.3。

基于命名空间或工作负载的细粒度控制

可以为特定命名空间或服务单独配置 TLS 版本,可通过PeerAuthentication资源实现。

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: tls-policy
  namespace: foo
spec:
  mtls:
    mode: STRICT
  portLevelMtls:
    8080:
      mode: STRICT
  minProtocolVersion: TLSv1_3

此策略会覆盖全局配置,仅对命名空间foo下的服务生效。

与自动双向 TLS 的兼容性

Istio 的 自动双向 TLS(Auto mTLS) 功能会根据工作负载是否注入 Sidecar 自动协商加密方式。当配置最低 TLS 版本后,Auto mTLS 会遵循该限制,仅使用符合版本的协议。

注意

  • 若旧版本服务不支持配置的 TLS 版本(如遗留系统仅支持 TLS 1.2),可能导致通信中断,需提前测试兼容性。
  • 配置更新后,建议使用istioctl analyze检查配置冲突。