k8sk8s部署网络插件Calico创建网络策略

Posted dezasseis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8sk8s部署网络插件Calico创建网络策略相关的知识,希望对你有一定的参考价值。

一、简介

01_calico简介

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创建网络策略的主要内容,如果未能解决你的问题,请参考以下文章

k83 calico 网络策略

12.基于canel的网络策略

k8s网络通信(flannelcalico)

kubernetes 二进制安装(v1.20.15)部署 网络插件

一文学会calico及k8s网络策略入门

一文学会Calico网络自定义