• K8S Calico


    NetworkPolicy是kubernetes对pod的隔离手段,是宿主机上的一系列iptables规则。

    Egress 表示出站流量,就是pod作为客户端访问外部服务,pod地址作为源地址。策略可以定义目标地址或者目的端口
    Ingress 表示入站流量,pod地址和服务作为服务端,提供外部访问。pod地址作为目标地址。策略可以定义源地址和自己端口

    官网
    https://docs.projectcalico.org/v3.1/getting-started/kubernetes/

    我们这里使用的是 flannel 构建 K8S 网络,使用 Calico 构建网络规则

    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
    # 运行结果:
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE
    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/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      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
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      podSelector: {}
      ingress:
      - {}
      policyTypes:
      - Ingress
    
    kubectl apply -f ingress-def.yaml -n dev
    
    
    curl 10.244.1.2   # 命名空间 prod pod1 正常访问
    
    curl 10.244.2.2   # 命名空间 dev pod1 正常访问
    
    

    通过规则限制入站流量

    kubectl delete netpol deny-all-ingress -n dev
    
    kubectl label pods pod1 app=myapp -n dev
    
    # 添加网络规则
    vi allow-netpol-demo.yaml
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-myapp-ingress
    spec:
      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: 443
    
    kubectl apply -f allow-netpol-demo.yaml -n dev
    
    kubectl get netpol -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/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-egress
    spec:
      podSelector: {}
      policyTypes:
      - Egress
    
    kubectl apply -f egrees-def.yaml -n prod
    
    kubectl get pods -n kube-system -o wide
    # 选取一个 coredns 的 pod ip
    
    kubectl exec pod1 -it -n prod -- /bin/sh
    ping 10.244.0.4    # 无法正常 ping 通
    
    
    # 放行所有的出站流量
    vi egrees-def.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-egress
    spec:
      podSelector: {}
      egress:
      - {}
      policyTypes:
      - Egress
    
    kubectl apply -f egrees-def.yaml -n prod
    
    kubectl exec pod1 -it -n prod -- /bin/sh
    ping 10.244.0.4    # 正常 ping 通
    
  • 相关阅读:
    安装系统时碰上hal.dll文件丢失或损坏问题
    系统无法停止USB接口的“通用卷”的解决方法
    提取嵌入excel或word中flash的VBA代码
    打印机的PCL驱程和PS驱程的区别!
    spoolsv.exe占用资源的解决方法
    检测硬盘与内存中的隐藏病毒
    关于Windows默认共享的一些认识
    SmartClient + WebServices 开发 1
    常用 ajax 框架比较摘自网络
    AJAX 框架 Prototype
  • 原文地址:https://www.cnblogs.com/klvchen/p/10000687.html
Copyright © 2020-2023  润新知