容器服务集群中的网络安全措施,主要包括:流量管制和网络加密。VKE 集群中提供多种功能支持上述网络安全措施。如下表所示。
网络安全策略 | 说明 |
---|---|
流量管制 | 指限制服务之间网络流量的规则。主要功能包括:网络策略和安全组。 |
网络加密 | 指对传输中的流量进行加密。主要功能包括:入口控制器和负载均衡器、服务网格。 |
在集群中使用 Kubernetes 网络策略和安全组进行流量管制,适用于不同的场景,详情如下表所示。
安全策略 | 使用场景 |
---|---|
Kubernetes 网络策略 | 控制集群中 Pod 到 Pod 的流量。
|
安全组 |
|
Kubernetes 网络策略和安全组的主要区别,如下表所示。
对比项 | Kubernetes 网络策略 | 火山引擎 VPC 安全组 |
---|---|---|
流量类型 | 集群内部东西向流量 | 控制 Pod 与 VPC 内资源(如 ECS、RDS)及公网的通信 |
控制层级 | OSI 第 3/4 层(IP/端口) | 基于火山引擎 VPC 安全组规则 |
适用场景 | 微服务间隔离 | 混合云架构或者和火山引擎云服务互访 |
生效范围 | 集群内 Pod | VPC 内所有资源 |
在 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。同样适用于出口规则。如果定义了多条规则,则在做出决定时会考虑所有规则的并集,顺序不会影响整体策略结果。
注意
当使用网络策略管控集群中的 Pod 流量时,常见的最佳实践是采用 最低权限原则,即首先禁止所有的 Pod 出站流量和入站流量,然后根据需求逐步放开指定的流量。实现集群中 Pod 流量的最小化原则。具体的操作流程,如下所示:
与 RBAC 策略一样,建议在网络策略中遵循最低权限访问原则。首先创建一个 全部拒绝 的策略,该策略限制命名空间中的所有入站和出站流量。
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} policyTypes: - Ingress - Egress
当您配置了 全部拒绝 规则后,就可以开始对其他流量进行按需放行,例如允许 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://github.com/ahmetb/kubernetes-network-policy-recipes | GitHub 仓库,提供了大量 Kubernetes 网络策略示例,涵盖常见使用场景,如限制流量、隔离命名空间等。 |
https://kubernetes.io/docs/concepts/services-networking/network-policies/ | Kubernetes 官方文档,介绍了网络策略的基本概念、使用方法和示例。 |
安全组是火山引擎 VPC 提供的安全策略。安全组由一系列安全组规则组成,用于控制网卡的出入流量,每张网卡必须加入安全组。安全组基于白名单原理设计,故网卡的流量必须被安全组允许才会放通。
在容器服务中配置安全组的最佳实践,请参见 安全组配置最佳实践。
说明
火山引擎服务网格产品当前处于邀测中,如有使用需求,请联系您的客户经理。
服务网格是专为应用程序设计的独立基础设施层。它允许透明地为应用添加可观测性、流量管理和安全能力,而无需修改业务代码。
说明
Istio 支持访问规则控制,具体操作方式,请参见 创建访问控制规则。
说明
双向 TLS(mTLS, Mutual Transport Layer Security)是一种双向身份验证协议,通信双方(客户端与服务端)均需验证对方证书,确保双方身份合法。
双向 TLS 的主要作用包括:
使用 Kubernetes 网络策略和服务网格的主要区别,如下表所示。
特性 | Kubernetes 网络策略 | 服务网格 |
---|---|---|
工作层级 | OSI 第 3 层(网络层)和第 4 层(传输层) | OSI 第 7 层(应用层) |
核心能力 | 基础网络隔离(IP/端口控制) | 高级流量管理、可观测性、安全增强 |
资源开销 | 低 | 高(需部署 Sidecar 代理等组件) |
说明
Kubernetes 网络策略和服务网格可协同使用,既能降低攻击面,又能实现精细化的应用层控制。
配置 Service 时基于如下注解,能够快速部署 HTTPS 加密的负载均衡器。
注解字段 | 字段类型 | 示例值 | 默认值 | 说明 |
---|---|---|---|---|
service.beta.kubernetes.io/volcengine-loadbalancer-protocol-port | JSON | "HTTP:80,HTTPS:443" | 无 | 定义负载均衡器监听的协议与端口(HTTP 用于自动重定向至 HTTPS)。 |
service.beta.kubernetes.io/volcengine-loadbalancer-cert-source | String | "clb" | "clb" | 指定证书来源为火山引擎负载均衡器(CLB),需提前在火山引擎控制台上传证书。 |
service.beta.kubernetes.io/volcengine-loadbalancer-cert-id | String | cert-xxxxxx(实际证书ID) | 无 | 绑定已预配置的 HTTPS 证书,确保传输层加密。 |
说明
负载均衡服务的配置详情,请参考 使用 Annotation 配置负载均衡服务
方案优势:
通过 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 协议
方案优势:
注意
protocol-port
注解配置自动重定向(HTTP > HTTPS)。在 Istio 中管理 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
下的服务生效。
Istio 的 自动双向 TLS(Auto mTLS) 功能会根据工作负载是否注入 Sidecar 自动协商加密方式。当配置最低 TLS 版本后,Auto mTLS 会遵循该限制,仅使用符合版本的协议。
注意
istioctl analyze
检查配置冲突。