k8sk8s部署网络插件Calico创建网络策略
Posted dezasseis
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8sk8s部署网络插件Calico创建网络策略相关的知识,希望对你有一定的参考价值。
一、简介
01_calico简介
- flannel实现的是网络通信 , calico的特性是在pod之间的隔离。
- 通过BGP路由,但大规模端点的拓扑计算和收敛往往需要一定的时间和计算资源。
- 纯三层的转发,中间没有任何的NAT和overlay,转发效率最好。
- Calico仅依赖三层路由可达。Calico 较少的依赖性使它能适配所有VM、Container、白盒或者混合环境场景。
02_calico网络架构
- Felix:监听ECTD中心的存储获取事件,用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。
- BIRD:一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,路由的时候到这里来。
IPIP工作模式:适用于互相访问的pod不在同一个网段中,跨网段访问的场景。
BGP工作模式:适用于互相访问的pod在同一个网段,适用于大型网络。
二、部署网络插件Calico
01_准备
之前安装过Flannel插件,需要清理相关信息:
- master端:
kubectl delete -f kube-flannel.yml
- 所有节点执行:
mv /etc/cni/net.d/10-flannel.conflist /mnt/
02_安装
- 建立目录
mkdir calico
cd calico/
- 下载yaml文件:
官网:wget https://docs.projectcalico.org/manifests/calico.yaml
这里使用自己定义的部署文件,还是在官网基础上修改的
#v3.16.1版本
需要修改一下内容及镜像版本
- name: CALICO_IPV4POOL_IPIP
value: “off” - 部署
kubectl apply -f calico.yaml
三、创建网络策略
创建带有标签:app=nginx 的服务nginx-svc
kubectl apply -f /root/ingress/nginx-svc.yml
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: myapp
image: myapp:v2
测试可以访问:
01_拒绝访问指定服务
- 设置带app=nginx标签的不能访问:
vim deny-nginx.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-nginx
spec:
podSelector:
matchLabels:
app: nginx
- 创建:
kubectl apply -f deny-nginx.yml
- 测试:curl访问失败
02_允许指定pod访问服务
-
未创建策略前pod访问app:nginx的服务被拒绝:
-
添加标签 app:demo:
kubectl label pod demo app=demo
-
vim acces-demo.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: access-nginx
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- from:
- podSelector:
matchLabels:
app: demo
-
创建策略:
kubectl apply -f acces-demo.yml
-
测试:访问成功
03_禁止 namespace 中所有pod之间的相互访问
- 创建命名空间demo
kubectl create namespace demo
- 创建两个pod并交互式(命名空间为demo)
kubectl run demo1 --image=radial/busyboxplus -it -n demo
kubectl run demo2 --image=radial/busyboxplus -it -n demo
- 命名空间demo中的pod可以相互访问
- 创建策略:
vim deny-pod.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: demo
spec:
podSelector: {}
kubectl apply -f deny-pod.yml
- 创建策略成功后:命名空间demo中的pod不能相互访问
04_禁止其他 namespace 访问服务
- 创建pod:可以访问
kubectl run nginx --image=myapp:v2
创建策略:vim deny-ns.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-namespace
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}
kubectl apply -f deny-ns.yml
- 测试:访问失败
05_允许指定namespace访问服务
- 允许 role=prod并且ns 为 test的 pod 可以访问 run=nginx
创建namespace为test
kubectl create namespace test
- 为test添加标签role:prod
kubectl label ns test role=prod
- 创建test下的pod并交互式
kubectl run test1 --image=radial/busyboxplus -it -n test
- 测试发现不能访问(在4.1中设置带app=nginx标签的不能访问)
- 创建策略:
vim acces-ns.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: access-namespace
spec:
podSelector:
matchLabels:
run: nginx
ingress:
- from:
- namespaceSelector:
matchLabels:
role: prod
kubectl apply -f acces-ns.yml
- 测试:成功访问
06_允许外网访问服务
- 带标签 app=nginx 的pod可以从外网访问到
- 创建ingress:
vim nginx.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-demo
spec:
rules:
- host: www1.westos.org
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
- 外网测试访问失败(提前解析www1.westos.org)
curl www1.westos.org
- 创建策略:
kubectl apply -f acces-ex.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
app: nginx
ingress:
- ports:
- port: 80
from: []
- 外网可以成功访问:
以上是关于k8sk8s部署网络插件Calico创建网络策略的主要内容,如果未能解决你的问题,请参考以下文章