NetworkPolicy是kubernetes对pod的隔离手段,是宿主机上的一系列iptables规则。
Egress 表示出站流量,就是pod作为客户端访问外部服务,pod地址作为源地址。策略可以定义目标地址或者目的端口 Ingress 表示入站流量,pod地址和服务作为服务端,提供外部访问。pod地址作为目标地址。策略可以定义源地址和自己端口
官网 https://docs.projectcalico.org/v3.1/getting-started/kubernetes/
mkdir ~/networkpolicy ; cd ~/networkpolicykubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yamlkubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yamlkubectl get pods -n kube-system# 创建两个命名空间 dev 和 prod 进行测试kubectl create namespace devkubectl create namespace prodvi pod-a.yaml# 内容如下apiVersion: v1kind: Podmetadata: name: pod1spec: containers: - name: myapp image: ikubernetes/myapp:v1# 在命名空间 dev 创建 pod1kubectl apply -f pod-a.yaml -n devkubectl get pods -n dev -o wide# 运行结果:NAME READY STATUS RESTARTS AGE IP NODEpod1 1/1 Running 0 14m 10.244.2.2 node2# 在命名空间 prod 创建 pod1kubectl apply -f pod-a.yaml -n prodkubectl get pods -n prod -o wide# 运行结果:NAME READY STATUS RESTARTS AGE IP NODEpod1 1/1 Running 0 14m 10.244.1.2 node1# 测试网络curl 10.244.1.2 # 正常访问curl 10.244.2.2 # 正常访问kubectl exec pod1 -it -n prod -- /bin/shping 10.244.2.2 # 链路正常
mkdir ~/networkpolicy ; cd ~/networkpolicy
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml
kubectl get pods -n kube-system
# 创建两个命名空间 dev 和 prod 进行测试
kubectl create namespace dev
kubectl create namespace prod
vi pod-a.yaml
# 内容如下
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
# 在命名空间 dev 创建 pod1
kubectl apply -f pod-a.yaml -n dev
kubectl get pods -n dev -o wide
# 运行结果:
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1/1 Running 0 14m 10.244.2.2 node2
# 在命名空间 prod 创建 pod1
kubectl apply -f pod-a.yaml -n prod
kubectl get pods -n prod -o wide
pod1 1/1 Running 0 14m 10.244.1.2 node1
# 测试网络
curl 10.244.1.2 # 正常访问
curl 10.244.2.2 # 正常访问
kubectl exec pod1 -it -n prod -- /bin/sh
ping 10.244.2.2 # 链路正常
Ingress
# Ingress 默认禁止所有的入站流量vi ngress-def.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all-ingressspec: podSelector: {} policyTypes: - Ingresskubectl apply -f ingress-def.yaml -n dev# 查看 networkpolicy 规则kubectl get netpol -n devcurl 10.244.2.2 # 命名空间 dev pod1 无法访问curl 10.244.1.2 # 命名空间 prod pod1 正常访问# 开放所有的入站流量vi ingress-def.yamlapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all-ingressspec: podSelector: {} ingress: - {} policyTypes: - Ingresskubectl apply -f ingress-def.yaml -n devcurl 10.244.1.2 # 命名空间 prod pod1 正常访问curl 10.244.2.2 # 命名空间 dev pod1 正常访问
# Ingress 默认禁止所有的入站流量
vi ngress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
name: deny-all-ingress
podSelector: {}
policyTypes:
- Ingress
kubectl apply -f ingress-def.yaml -n dev
# 查看 networkpolicy 规则
kubectl get netpol -n dev
curl 10.244.2.2 # 命名空间 dev pod1 无法访问
curl 10.244.1.2 # 命名空间 prod pod1 正常访问
# 开放所有的入站流量
vi ingress-def.yaml
ingress:
- {}
curl 10.244.2.2 # 命名空间 dev pod1 正常访问
通过规则限制入站流量
kubectl delete netpol deny-all-ingress -n devkubectl label pods pod1 app=myapp -n dev# 添加网络规则vi allow-netpol-demo.yamlapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: allow-myapp-ingressspec: podSelector: matchLabels: app: myapp # 选择app=myapp 的标签放行 ingress: - from: - ipBlock: # 地址段 cidr: 10.244.0.0/16 # 允许这个地址段访问 except: # 排除一下地址不可以访问 - 10.244.1.2/32 ports: - protocol: TCP port: 80 # 允许访问80端口 - protocol: TCP port: 443kubectl apply -f allow-netpol-demo.yaml -n devkubectl get netpol -n devcurl 10.244.2.2:80 # 命名空间 dev pod1 正常访问curl 10.244.2.2:443 # NetworkPolicy 放行,没有开放 443 端口,服务器拒绝curl: (7) Failed connect to 10.244.2.2:443; Connection refusedcurl 10.244.2.2:6443 # 卡住,被 NetworkPolicy 拒绝
kubectl delete netpol deny-all-ingress -n dev
kubectl label pods pod1 app=myapp -n dev
# 添加网络规则
vi allow-netpol-demo.yaml
name: allow-myapp-ingress
podSelector:
matchLabels:
app: myapp # 选择app=myapp 的标签放行
- from:
- ipBlock: # 地址段
cidr: 10.244.0.0/16 # 允许这个地址段访问
except: # 排除一下地址不可以访问
- 10.244.1.2/32
ports:
- protocol: TCP
port: 80 # 允许访问80端口
port: 443
kubectl apply -f allow-netpol-demo.yaml -n dev
curl 10.244.2.2:80 # 命名空间 dev pod1 正常访问
curl 10.244.2.2:443 # NetworkPolicy 放行,没有开放 443 端口,服务器拒绝
curl: (7) Failed connect to 10.244.2.2:443; Connection refused
curl 10.244.2.2:6443 # 卡住,被 NetworkPolicy 拒绝
Egress
# 默认限制所有的出站流量vi egrees-def.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all-egressspec: podSelector: {} policyTypes: - Egresskubectl apply -f egrees-def.yaml -n prodkubectl get pods -n kube-system -o wide# 选取一个 coredns 的 pod ipkubectl exec pod1 -it -n prod -- /bin/shping 10.244.0.4 # 无法正常 ping 通# 放行所有的出站流量vi egrees-def.yaml apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-all-egressspec: podSelector: {} egress: - {} policyTypes: - Egresskubectl apply -f egrees-def.yaml -n prodkubectl exec pod1 -it -n prod -- /bin/shping 10.244.0.4 # 正常 ping 通
# 默认限制所有的出站流量
vi egrees-def.yaml
name: deny-all-egress
- Egress
kubectl apply -f egrees-def.yaml -n prod
kubectl get pods -n kube-system -o wide
# 选取一个 coredns 的 pod ip
ping 10.244.0.4 # 无法正常 ping 通
# 放行所有的出站流量
egress:
ping 10.244.0.4 # 正常 ping 通
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728