zoukankan      html  css  js  c++  java
  • k8s之网络插件flannel及基于Calico的网络策略

    1.k8s网络通信

    a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现;

    b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可通信;

    c.pod和service通信:pod ip <----> cluster ip(即service ip)<---->pod ip,它们通过iptables或ipvs实现通信,ipvs取代不了iptables,因为ipvs只能做负载均衡,而做不了nat转换;

    d.Service与集群外部客户端的通信.

    kubectl get configmap -n kube-system
    kubectl get configmap kube-proxy  -o yaml  -n kube-system
    看到mode是空的,把它改为ipvs就可以
    k8s靠CNI接口接入其他插件来实现网络通讯.目前比较流行的插件有flannet、callco、canel.
    

    这些插件使用的解决方案有如下方式:

    a.虚拟网桥:虚拟网卡,多个容器共用一个虚拟网卡进行通信;

    b.多路复用:MacVLAN,多个容器共用一个物理网卡进行通信;

    c.硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好.

    CNI插件存放位置
    cat /etc/cni/net.d/10-flannel.conflist
    flanel只支持网络通讯,但是不支持网络策略;
    callco网络通讯和网络策略都支持;canel:flanel+callco
    可以部署flanel提供网络通讯,再部署一个callco只提供网络策略,而不用canel. 
    mtu:是指一种通信协议的某一层上面所能通过的最大数据包大小.
    

    通过ifconfig可以看到flannel.1的地址是10.244.1.0,子网掩码是255.255.255.255,mtu是1450,正常mtu是1500,mtu要留出一部分做封装叠加,额外开销使用.

      两个节点上的pod可以借助flannel隧道进行通信,默认使用VxLAN协议,有额外开销,所以性能有点低;

      flannel第二种协议叫host-gw(host gateway),即Node节点把自己的网络接口当做pod的网关使用,从而使不同节点上的node进行通信,性能比VxLAN高,因为它没有额外开销,不过有个缺点,就是各node节点必须在同一个网段中;

      如果两个pod所在节点在同一个网段中,可以让VxLAN也支持host-gw的功能,即直接通过物理网卡的网关路由转发,而不用隧道flannel叠加,从而提高了VxLAN的性能,这种flannel的功能叫directrouting,如果不在同一网段,则使用VxLAN叠加隧道.

    network:flannel使用CIDR格式的网络地址,用于为pod配置网络功能.

    kubectl get configmap -n kube-system kube-flannel-cfg -o json -n kube-system
    1)10.244.0.0/16--->
    master: 10.244.0.0./24
    node01: 10.244.1.0/24
    ....
    node255: 10.244.255.0/24
    可以支持256个节点
    

    2)SubnetLen:把network切分为子网供各节点使用时,使用多长的掩码进行切分,默认为24位;

    3)SubnetMin:指明子网中的地址段最小多少可以分给子网使用,比如可以限制10.244.10.0/24,这样0~9就不让用;

    4)SubnetMax:表示最多使用多少个,比如10.244.100.0/24;

    5)Backend:Vxlan,host-gw,udp(最慢)

    kubectl edit configmap kube-flannel-cfg -n kube-system
    
    {
          "Network": "10.244.0.0/16",
          "Backend": {
            "Type": "vxlan",
            "Directrouting": true # 加一行这个
          }
    }
    # 不要通过这种方式修改配置,应该在第一次安装flannel时就加上这一行,否则就需要卸载掉已安装的flannel,
    修改下载好的配置文件,重新apply,才能实现同网段通过物理网卡实现网络通信.
    route -n
    10.244.1.0      10.244.1.0      255.255.255.0   UG    0      0        0 flannel.1
    10.244.2.0      10.244.2.0      255.255.255.0   UG    0      0        0 flannel.1
    # 没改之前,同一网段的不同节点通信是靠叠加网络,改完生效之后,这两个节点通信就是host-gw-用网卡通信
    route -n
    10.244.1.0      10.0.0.20       255.255.255.0   UG    0      0        0 eth0
    10.244.2.0      10.0.0.30       255.255.255.0   UG    0      0        0 eth0
    

    2.Calico演示

    安装文档:https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/flannel

    # 和k8s使用同一套API数据存储
    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
    

    Egress:出站,表示pod自己是客户端,访问别人;

    Ingress:入站,表示Pod自己是目标,别人来访问自己;通常,客户端的端口是随机的,服务端的端口是固定的;

    Network Policy:用来控制哪些pod和外部或内部进行通信;

    podSelector:pod选择器;  policyTypes:用来控制Ingres和Egres哪个生效.

    创建两个名称空间,一个是测试,一个是生产

    kubectl create namespace dev
    kubectl create namespace prod
    mkdir networkpolicy && cd networkpolicy/
    cat ingress-def.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      podSelector: {}
      policyTypes: 
      - Ingress
    
    # pod选择器设置为空,表示选择所有pod,即控制整个名称空间
    # 只写了ingress生效,又把podSelector设置为空,表示拒绝其它名称空间访问,拒绝所有入站请求
    # 没有加egress,所以默认egress是允许本名称空间所有pod出站
    kubectl apply -f ingress-def.yaml -n dev
    # 在dev名称空间创建一个pod
    cat pod-a.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod1
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
    kubectl apply -f pod-a.yaml -n dev
    # 拒绝任何入站请求
    curl 10.244.2.2
    # 将ingress设置为空,表示允许所有入站访问
    cat ingress-def.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      podSelector: {}
      ingress:
      - {}
      policyTypes:
      - Ingress
    
    # 给dev名称空间里面的pod1打个标签app=myapp 
    cat allow-netpol-demo.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-myapp-ingress
    spec:
      podSelector:
        matchLabels:
          app: myapp
      ingress:
      - from:
        - ipBlock:
            cidr: 10.244.0.0/16
            except:
            - 10.244.1.2/32 
        ports:
        - protocol: TCP
          port: 80
    
    # cidr:指定网段,允许从10.244.0.0/16网段访问指定标签的pod
    # except:排除某些地址
    kubectl apply -f allow-netpol-demo.yaml -n dev
    kubectl get netpol -n dev
    

    egress出站规则

    cat egress-def.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-egress
    spec:
      podSelector:
      policyTypes:
      - Egress
    kubectl apply -f egress-def.yaml -n prod
    # ping其他名称空间的容器没反应,是因为网络策略deny-all-egress起了作用
    kubectl exec pod1 -it  -n prod -- /bin/sh
    # 允许所有egress出站
    cat egress-def.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-egress
    spec:
      podSelector: {}
      egress:
      - {}
      policyTypes:
      - Egress
    

    参考博客:http://blog.itpub.net/28916011/viewspace-2215295/

    参考博客:http://blog.itpub.net/28916011/viewspace-2215383/

  • 相关阅读:
    android学习笔记07(activity跳转,通信,及发短信)
    android学习笔记05(RadioGroup,CheckBox,Toast)
    义无返顾
    android学习笔记01(LinearLayout)
    linux远程桌面学习
    android学习笔记08(activity通信的一个实例乘法计算器)
    android学习笔记12(ProgressBar进度条初级学习)
    android学习笔记06(第一个程序)
    android学习笔记03(RelativeLayout)
    poj2886 Who Gets the Most Candies?
  • 原文地址:https://www.cnblogs.com/fawaikuangtu123/p/11296382.html
Copyright © 2011-2022 走看看