目录
一、flannel网络插件
Flannel是一种Kubernetes网络插件,它可以为Kubernetes集群提供网络通信能力。Flannel使用虚拟网络层来创建整个集群的单一网络。在Flannel中,每个节点都有一个子网,节点之间的通信是通过路由转发完成的。Flannel可以使用不同的后端(例如UDP、VXLAN或AWS VPC)来创建虚拟网络,为Kubernetes的网络提供可靠而高效的通信方式。Flannel还提供多种IP自动分配方案,从而可以简化节点配置和管理。
使用host-gw模式
kubectl -n kube-flannel edit cm kube-flannel-cfg
重启pod生效
kubectl -n kube-flannel delete pod --all
二、calico网络插件
Calico网络插件是一个开源的容器网络解决方案,旨在为Kubernetes和其他容器化平台提供高性能、高可靠性的网络。它是一个基于BGP协议的网络解决方案,可以轻松地扩展到大规模网络环境中,并且支持多租户和安全策略。它提供了灵活性和可扩展性,并且可以与现有的网络设施无缝地集成。Calico还提供了网络安全功能,如ACL、流量控制和加密等,可以保护网络免受不良网络行为的侵害。
1、部署
删除flannel插件
kubectl delete -f kube-flannel.yml
删除所有节点上flannel配置文件,避免冲突
rm -f /etc/cni/net.d/10-flannel.conflist
下载部署文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
修改镜像路径
下载镜像
docker pull docker.io/calico/cni:v3.25.0
docker pull docker.io/calico/node:v3.25.0
docker pull docker.io/calico/kube-controllers:v3.25.0
上传镜像到harbor
部署calico
kubectl apply -f calico.yaml
kubectl -n kube-system get pod -o wide
重启所有集群节点,让pod重新分配IP
等待集群重启正常后测试网络
2、网络策略
(1)限制pod流量
vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp-v1
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: test
ports:
- protocol: TCP
port: 80
kubectl apply -f networkpolicy.yaml
kubectl describe networkpolicies
控制的对象是具有app=myapp-v1标签的pod
kubectl get pod --show-labels
此时访问svc是不通的
kubectl get svc
kubectl run demo --image busyboxplus -it --rm
给测试pod添加指定标签后,可以访问
(2)限制namespace流量
vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: test
- podSelector:
matchLabels:
role: test
ports:
- protocol: TCP
port: 80
kubectl apply -f networkpolicy.yaml
kubectl describe networkpolicies.
给namespace添加指定标签
kubectl create namespace test
kubectl label ns test project=test
kubectl get ns test --show-labels
测试:
(3)同时限制namespace和pod
vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: test
podSelector:
matchLabels:
role: test
ports:
- protocol: TCP
port: 80
kubectl apply -f networkpolicy.yaml
kubectl describe networkpolicies.
给test命令空间中的pod添加指定标签后才能访问
kubectl run -n test demo --image busyboxplus -it --rm
kubectl -n test label pod demo role=test
kubectl -n test get pod --show-labels
(4)限制集群外部流量
vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app: myapp
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 192.168.56.0/24
- namespaceSelector:
matchLabels:
project: myproject
podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 80
kubectl apply -f networkpolicy.yaml
kubectl describe networkpolicies.
kubectl get svc
修改v1为LoadBalancer类型
测试: