zoukankan      html  css  js  c++  java
  • 13、kubernetes之网络插件

    一、基本网络概念

    • Kubernetes网络通信情景
      1. 容器间通信:同一个Pod内的多个容器间的通信,lo
      2. Pod通信:PodIP <---> PodIP
      3. Pod与service通信:PodIP <---> ClusterIP
      4. Service与集群外部客户端的通信,Ingress,NodePort等
    • CNI:容器网络接口
      1. flannel:支持网络管理,但是不支持网络策略
      2. calico:支持网络管理和网络策略
      3. canel
      4. kube-router
    • 解决方案:
      • 虚拟网桥:叠加网络方式实现
      • 多路复用:MacVLAN机制,一张网卡多个POD使用
      • 硬件交换:SR-IOV,单根IO虚拟化,将一张网卡虚拟出多个物理网卡
    • kubelet网络插件配置
    [root@master ~]# cat /etc/cni/net.d/10-flannel.conflist 
    {
      "name": "cbr0",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
    

    二、Flannel

    flannel的三种网络实现方式

    • host-gw: host Gateway,直接路由传输,各节点维护一张路由表,将自己的物理网卡作为POD的网关,所有物理机必须在同一三层网络中

    • VxLAN

      • vxlan:隧道模式,在物理机与物理机直接建立基于VxLAN的隧道承载POD直接的网络报文传输
      • Directrouting:如果目标POD所在节点和原POD所在节点在同一三层网络中则使用host-gw方式通信,如果不在同一三层网络中则降级为vxlan模式通信
    • UDP

    1、配置参数

    # kubectl get configmap kube-flannel-cfg -n kube-system -o yaml  #获取flannel的配置
    
    • Network:flannel使用的CIDR格式的网络地址,用于为Pod配置网络功能
    • SubnetLen:把Network切分子网供各节点使用时,使用多长的掩码进行切分,默认24位
    • SubnetMin和SubnetMax:指定子网的开始和结束
    • Backend:vxlan,host-gw,udp

    2、开启Directrouting功能

    # vim net-conf.json 
    {
            "Network": "10.244.0.0/16",
            "backend": {
                    "Type": "vxlan"
                    "Directrouting": true
            }
    }
    # vim kube-flannel.yml  #flannel编排文件中的配置修改为如上配置
    # kubectl apply -f kube-flannel.yml
    # ip route show
    10.244.0.0/24 via 192.168.100.51 dev eth0   #有如此路由说明修改成功
    10.244.2.0/24 via 192.168.100.62 dev eth0 
    

    三、Calico

    1、部署canal

    使用flannel提供网管理功能,使用calico提供网络策略功能,使用k8s的etcd为calico的元数据库

    # curl https://docs.projectcalico.org/manifests/canal.yaml -O
    # POD_CIDR="10.244.0.0/16" ;sed -i -e "s?10.244.0.0/16?$POD_CIDR?g" canal.yaml  #修改your-pod-cidr
    # kubectl apply -f canal.yaml
    

    2、创建测试规则示例

    • 拒绝所有入栈流量
    # kubectl create namespace dev
    # kubectl create namespace prod
    # vim ingress-def.yaml  #未定义ingress规则则表示拒绝所以入栈
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      podSelector: {}  #表示选择所有pod
      policyTypes:
      - Ingress  #表示入栈流量限制,出栈流量不限制
    # kubectl apply -f ingress-def.yaml -n dev
    # kubectl get netpol -n dev
    # vim pod1.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod1
    spec:
      containers:
      - name: myapp
        image: dongfeimg/myapp:v1
    # kubectl apply -f pod1.yaml -n dev
    # kubectl apply -f pod1.yaml -n prod
    # kubectl get po -n dev -o wide
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    pod1   1/1     Running   0          42s   10.244.2.2   node02   <none>           <none>
    # kubectl get po -n prod -o wide
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    pod1   1/1     Running   0          41s   10.244.1.2   node01   <none>           <none>
    访问10.244.2.2无法访问,访问10.244.1.2可以访问,说明规则生效
    
    • 放开所以入栈流量
    # vim ingress-def.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      podSelector: {}
      ingress:
      - {}  #允许所有入栈流量
      policyTypes:
      - Ingress
    
    • 放行特定的入栈流量
    # kubectl label pods pod1 app=myapp -n dev
    # vim allow-netpol-demo.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-myapp-ingress
    spec:
      podSelector:  #选择标签为myapp的pod
        matchLabels:
          app: myapp
      ingress:
      - from:   #定义客户端的ip地址段
        - ipBlock:
            cidr: 10.244.0.0/16
            except:  #在10.244.0.0/16中排除10.244.1.2/32地址
            - 10.244.1.2/32
        ports:  #定义只开放tcp/80
        - protocol: TCP
          port: 80
        - protocol: TCP
          port: 443
    
  • 相关阅读:
    ICONS-图标库
    图形资源
    vue项目中,如果修改了组件名称,vscode编辑器会在引入修改组件的名字处提示红色波浪线 The file is in the program because:Imported via xxx Root file specified for compilation .
    接口在dev环境报跨域问题(has been blocked by CORS policy:Response to preflight request doesn't pass access control check:No 'Access-Control-Allow-Origin' header ispresent on the requested resource.),qa环境正常
    阿里云occ的图片文件URL用浏览器直接打开无法访问,提示This XML file does noe appear to have any style information associated with it. The document tree is shown below.
    vue 项目使用element ui 中tree组件 check-strictly 用法(父子不互相关联的反显情况)
    高德地图进行线路规划绘制标记点操作(vue)
    vue中实现拖拽调整顺序功能
    2021-01-22 浏览器相关知识
    2021-01-22 js 相关知识点
  • 原文地址:https://www.cnblogs.com/L-dongf/p/12317685.html
Copyright © 2011-2022 走看看