概述
Kubernetes 网络和安全是生产环境中的重要主题。本文介绍 Kubernetes 的网络模型、网络策略以及安全最佳实践。Kubernetes 网络模型
Kubernetes 网络遵循以下基本原则:- 所有 Pod 可以相互通信,无需 NAT
- 所有节点可以与所有 Pod 通信,无需 NAT
- Pod 看到的自己的 IP 与其他 Pod 看到的一致
网络通信类型
| 类型 | 说明 |
|---|---|
| Pod 内部通信 | 同一 Pod 内容器通过 localhost 通信 |
| Pod 间通信 | 不同 Pod 通过 Pod IP 直接通信 |
| Pod 到 Service | 通过 Service ClusterIP 和 DNS |
| 外部到集群 | 通过 NodePort、LoadBalancer、Ingress |
CNI 网络插件
Kubernetes 使用 CNI(Container Network Interface)插件来实现网络功能。 常见 CNI 插件:| 插件 | 特点 |
|---|---|
| Calico | 功能全面,支持 NetworkPolicy |
| Flannel | 简单易用,适合入门 |
| Cilium | 基于 eBPF,高性能 |
| Weave | 简单,支持加密 |
| Canal | Flannel + Calico 的结合 |
安装 Calico
NetworkPolicy
NetworkPolicy 是 Kubernetes 原生的网络安全策略,用于控制 Pod 之间的网络流量。默认行为
- 默认情况下,Pod 之间没有网络隔离
- 一旦应用 NetworkPolicy,未被允许的流量将被拒绝
基本结构
示例:默认拒绝所有入站流量
示例:默认拒绝所有出站流量
示例:允许特定 Pod 访问
示例:跨命名空间访问
示例:允许外部 IP 访问
RBAC 权限控制
RBAC(Role-Based Access Control)是 Kubernetes 的授权机制。核心概念
| 资源 | 说明 |
|---|---|
| Role | 命名空间级别的权限定义 |
| ClusterRole | 集群级别的权限定义 |
| RoleBinding | 将 Role 绑定到用户/组/ServiceAccount |
| ClusterRoleBinding | 将 ClusterRole 绑定到用户/组/ServiceAccount |
创建 Role
创建 ClusterRole
创建 RoleBinding
创建 ClusterRoleBinding
ServiceAccount
Pod 安全标准
PodSecurityContext
Pod Security Standards
Kubernetes 1.25+ 支持 Pod Security Standards:| 级别 | 说明 |
|---|---|
| privileged | 无限制,用于系统级工作负载 |
| baseline | 最小限制,防止已知的权限提升 |
| restricted | 最严格,遵循最佳安全实践 |
Secret 安全
加密 Secret
配置 etcd 加密:外部密钥管理
使用 External Secrets Operator 集成外部密钥管理:网络安全最佳实践
1. 最小权限原则
2. 命名空间隔离
3. 限制出站流量
镜像安全
镜像拉取策略
私有仓库认证
镜像扫描
使用 Trivy 扫描镜像:审计日志
配置审计策略
审计日志级别
| 级别 | 说明 |
|---|---|
| None | 不记录 |
| Metadata | 只记录请求元数据 |
| Request | 记录元数据和请求体 |
| RequestResponse | 记录元数据、请求体和响应体 |
安全检查清单
集群安全
- 启用 RBAC
- 配置 API Server 认证
- 启用审计日志
- 定期轮换证书
- 限制 kubelet 权限
工作负载安全
- 使用非 root 用户运行容器
- 设置只读根文件系统
- 禁用特权容器
- 配置资源限制
- 使用 NetworkPolicy
数据安全
- 启用 etcd 加密
- 使用 Secret 存储敏感数据
- 考虑使用外部密钥管理
- 定期备份
镜像安全
- 使用可信基础镜像
- 定期扫描漏洞
- 使用固定版本标签
- 配置镜像拉取策略
- 使用 NetworkPolicy 实现网络隔离
- 使用 RBAC 控制访问权限
- 配置 Pod 安全上下文
- 保护敏感数据(Secret 加密)
- 定期进行安全审计