k8s基于canel的网络策略
Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的。但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制。
亲测:在kubernetes集群中,默认可以设定NetworkPolicy资源,但是必须安装支持网络策略的插件,否则即使设置好网络策略也不会生效。
calico提供了多种解决方案:
(1)使用flannel提供网络,使用calico插件提供网络策略;
(2)使用calico同时提供网络和策略;
(3)仅使用calico提供网络策略;
。。。
flannel并不能对集群中网络提供网络策略功能,但是并没有必要卸载flannel单独安装calico。
多数情况下,我们使用calico提供的第一种解决方案,只需要安装calico的网络策略功能插件即可。
我们使用第一种,让flannel提供网络功能,calico提供网络策略功能:
有两种安装方式:1.使用kubernetes的etcd存储栈;
2.单独创建专门用于canal插件的etcd存储栈;
一般使用基于Kubernetes API的etcd存储栈,而且是官方推荐的方案。
官网:https://docs.projectcalico.org
安装:
(1)安装calico的canal插件:
curl https://docs.projectcalico.org/v3.7/manifests/canal.yaml -O
(2)如果您使用的是pod cidr 10.244.0.0/16,请跳到下一步。如果您使用的是不同的pod cidr,请使用以下命令来设置包含pod cidr的环境变量pod cidr,并将清单中的10.244.0.0/16替换为pod cidr。
POD_CIDR="<your-pod-cidr>" \
sed -i -e "s?10.244.0.0/16?$POD_CIDR?g" canal.yaml
(3)部署canal插件:
kubectl apply -f canal.yaml
使用kubectl get pods -n kube-system中查看安装进程。
安装完成后,即可编写networkPolicy的资源清单。
NetworkPolicy的配置清单编写:
NetworkPolicy是kubernetes集群中标准的资源,所以书写格式和其他资源的清单差不多。
主要字段:
1 apiVersion: Networking.k8s.io/v1 2 kind: NetworkPolicy 3 metadata: 4 name: 5 namespace: 6 spec: 7 egress: ##出站规则。不写则按默认允许所有出站; 8 ingress: ##入站规则。不写则按默认不允许所有入站; 9 podSelector: ##必写字段。不写则策略将应用在所在的命名空间下的所有资源; 10 policyTypes: ##策略类型:egress或ingress或无或搭配;
例:禁止所有入站:
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: deny-all-ingress
5 spec:
6 podSelector: {}
7 policyTypes:
8 - Ingress
例:允许所有出站:
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: allow-all-egress
5 spec:
6 podSelector: {}
7 egress:
8 - {}
9 policyTypes:
10 - Egress
例:允许特定的访问流量
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: allow-myapp-policy
5 spec:
6 podSelector:
7 matchLabels:
8 app: myapp ##标签为app=myapp允许入站访问。
9 ingress:
10 - from:
11 - ipBlock: ##地址段。
12 cidr: 10.244.0.0/16 ##允许这个地址段访问。
13 except: ##以下地址不可以访问。
14 - 10.244.1.2/32
15 ports:
16 - port: 80 ##只允许访问80端口。
17 protocol: TCP
例:指定pod标签访问
我们要对namespace为dev,带有"role: backend"标签的所有pod进行访问控制:只允许标签为"role: frontend"的Pod,并且TCP端口为80的数据流入,其他流量都不允许。
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: all-frontend
5 spec:
6 podSelector:
7 matchLabels:
8 role:backend
9 ingress:
10 - from:
11 - podSelector:
12 matchLabels:
13 role: frontend
14 ports:
15 - protocol: TCP
16 port: 80
例:指定namespaces标签访问
我们要对标签为"role=frontend"的所有Pod进行访问控制:只允许namespace标签为"user=smbands"的各Pod,并且TCP端口为443的数据流入,其他流量都不允许。
1 apiVersion: networking.k8s.io/v1
2 kind: NetworkPolicy
3 metadata:
4 name: allow-tcp-443
5 spec:
6 podSelector:
7 matchLabels:
8 role: frontend
9 ingress:
10 - ports:
11 - protocol: TCP
12 port: 443
13 from:
14 - namespaceSelector:
15 matchLabels:
16 user: smbands
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构