• 19.网络插件calico


    19.网络插件calico

    官网: https://docs.projectcalico.org/v3.8/introduction/
    calico默认工作在192.168.0.0/16 的网络
    calico还不支持ipvs

    ====

    Egres 出站
    Ingress 入站
    networkpolicy 网络策略,简写 netpol

    查看网络策略帮助:
    kubectl explain networkpolicy

    查看某名称空间的网络策略:
    [root@k8s-master networkpoliy]# kubectl get netpol -n dev
    NAME POD-SELECTOR AGE
    deny-all-ingress 73s

    ====
    calico有多种部署方法,我们这里介绍的是使用flannel和calico混用的方法。这里也比较推荐这种方法。
    flannel负责网络部分的功能,而calico我们只使用它的网络策略的功能。

    calico部署:
    1. 另外单独部署一个etcd
    官方文档:
    https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/flannel

    2. 公用集群的etcd
    wget https://docs.projectcalico.org/v3.8/manifests/canal.yaml
    kubectl apply -f canal.yaml  
    
    [root@k8s-master networkpoliy]# kubectl get pods -n kube-system
    NAME                                 READY   STATUS    RESTARTS   AGE
    canal-j9mlh                          2/2     Running   0          97m
    canal-jgj2j                          2/2     Running   0          97m
    

    =====================

    calico实例:

    [root@k8s-master networkpoliy]# kubectl create namespace dev
    namespace/dev created
    [root@k8s-master networkpoliy]# kubectl create namespace prod
    namespace/prod created
    
    
    [root@k8s-master networkpoliy]# cat ingress.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
      namespace: dev
    
    spec:
      podSelector: {}  #空表示选择该名称空间的所有pod
      policyTypes:       #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
      - Ingress
    
    
    [root@k8s-master networkpoliy]# cat pod-a.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod1
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
    
    
    [root@k8s-master networkpoliy]# kubectl apply -f  pod-a.yaml -n dev
    pod/pod1 created
    
    [root@k8s-master networkpoliy]# kubectl apply -f  pod-a.yaml -n prod
    pod/pod1 created
    
    [root@k8s-master networkpoliy]# kubectl get pods -n dev -o wide
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
    pod1   1/1     Running   0          31s   10.244.1.2   k8s-node1   <none>           <none>
    
    
    [root@k8s-master networkpoliy]# kubectl get pods -n prod -o wide
    NAME   READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
    pod1   1/1     Running   0          11s   10.244.1.3   k8s-node1   <none>           <none>
    
    [root@k8s-master networkpoliy]# curl 10.244.1.2 
    ^C
    [root@k8s-master networkpoliy]# curl 10.244.1.3
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    
    dev的ns我们应用了策略,所以通过curl请求不到数据,prod的ns中我们没有应用网络策略,所以我们可以通过curl正常请求到。
    
    

    添加入站规则

      ingress:
      - {}       #这个{}写法表示允许所有的入站,allow all
    
    [root@k8s-master networkpoliy]# cat ingress.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
      namespace: dev
    
    spec:
      podSelector: {}  #空表示选择该名称空间的所有pod
      ingress:
      - {}       #这个{}写法表示允许所有的入站,allow all
      policyTypes:       #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
    
    [root@k8s-master networkpoliy]# kubectl apply -f ingress.yaml -n dev
    networkpolicy.networking.k8s.io/deny-all-ingress configured
    
    [root@k8s-master networkpoliy]# curl 10.244.1.2 
    Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
    
    当我们修改策略允许dev上所有可以入站后可以正常请求到10.244.1.2了。
    
    

    添加一个入站规则,允许10.244.0.0/16这个网段的除了10.244.1.3这个ip,都可以访问pod的80端口,使用podSelector来匹配pod

    [root@k8s-master networkpoliy]# cat allow-netpol.demo.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-myapp-ingress
    spec:
      podSelector:
        matchLabels:
          app: myapp
      ingress:
      - from:       #这里不写from则允许所有可以访问
        - ipBlock:         
            cidr: 10.244.0.0/16               #指定网段
            except: 
            - 10.244.1.3/32           #除开这个ip
        ports:
        - protocol: TCP
          port: 80
    
    [root@k8s-master networkpoliy]# kubectl apply -f allow-netpol.demo.yaml -n dev
    
    [root@k8s-master networkpoliy]#  telnet 10.244.1.2 80
    Trying 10.244.1.2...
    Connected to 10.244.1.2.
    Escape character is '^]'.
    
    在本地测试,可以正常连接
    
    [root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
    / # telnet 10.244.1.2 80
    
    登录到10.244.1.3这个pod上,则测试telnet 80端口不通,说明策略生效。 
    
    

    添加一个出站策略:

    拒绝所有出站策略:
    
    [root@k8s-master networkpoliy]# cat egress.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-egress
      namespace: prod
    
    spec:
      podSelector: {}  #空表示选择该名称空间的所有pod
      policyTypes:       #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
      - Egress
    
    
    [root@k8s-master networkpoliy]# kubectl apply -f egress.yaml  -n prod
    
    [root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
    / # ping 10.250.0.89
    PING 10.250.0.89 (10.250.0.89): 56 data bytes
    
    
    ping k8s-master上的kube-scheduler-k8s-master 的ip发现ping不通,策略生效。
    
    
    允许所有出去的策略:
    [root@k8s-master networkpoliy]# cat egress.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-egress
      namespace: prod
    
    spec:
      podSelector: {}  #空表示选择该名称空间的所有pod
      egress:
      - {}
      policyTypes:       #当这里写了Ingress,则Ingress中定义的规则生效,如果规则为空则为全部拒绝。这里没有写Egres,则表示Egres规则不生效,默认全开。
      - Egress
    
    [root@k8s-master networkpoliy]# kubectl apply -f egress.yaml  -n prod
    networkpolicy.networking.k8s.io/deny-all-egress configured
    
    [root@k8s-master networkpoliy]# kubectl exec pod1 -it -n prod -- /bin/sh
    / # ping 10.250.0.89
    PING 10.250.0.89 (10.250.0.89): 56 data bytes
    64 bytes from 10.250.0.89: seq=119 ttl=63 time=0.384 ms
    64 bytes from 10.250.0.89: seq=120 ttl=63 time=0.505 ms
    64 bytes from 10.250.0.89: seq=121 ttl=63 time=0.373 ms
    64 bytes from 10.250.0.89: seq=122 ttl=63 time=0.360 ms
    64 bytes from 10.250.0.89: seq=123 ttl=63 time=0.504 ms
    
    ping通了,策略生效。
    

    一般对于网络策略设置的规范:

    对于网络策略来讲:
    名称空间:
    拒绝所有出站,入站规则
    方形所有出站目标名称空间内的所有Pod

  • 相关阅读:
    【模版 Luogu P3808/P3796/P5357】AC自动机(简论)
    2019暑假 诸暨海亮集训游记
    【数据结构模版】可持久化线段树 && 主席树
    2019浙江集训——待整理的知识点、博客和题解
    浅谈树链剖分 F&Q
    Luogu P1967 NOIP2013 货车运输
    最小树形图(朱刘算法)--学习笔记
    Luogu P43916 图的遍历
    pytest扫盲12--assert断言
    pytest扫盲11--xfail参数详解
  • 原文地址:https://www.cnblogs.com/heaven-xi/p/11312633.html
Copyright © 2020-2023  润新知