k8s基于canal的网络策略

安装条件:

1、kubelet必须配置为CNI网络插件(即--network-plugin-cni,默认新版本默认就是CNI) 
2、kube-proxy必须以iptables模式启动,不能以ipvs方式启动; 
3、kube-proxy不能以--masquerade-all方式启动,因为这和calico策略冲突; 
4、k8s版本至少要v1.3.0 
5、--cluster-cidr=10.244.0.0/16 and --allocate-node-cidrs=true.

部署canal

1、如果集群启用了RBAC,则使用以下命令来配置Calico所需的角色和绑定。
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/rbac.yaml
2、部署canal
kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/canal/canal.yaml

kubernetes中的网络控制策略

networkpolicy.spec讲解:

1.egress:
出站流量规则,可以根据ports和to去定义规则。ports:指定目标端口和协议,如果此字段为空或丢失,则此规则
匹配所有端口(不受端口限制的流量)。to(目标地址):目标地址,分为ip地址段、pod、namespace,如果这个字段为空或丢失,此规则匹配所有目标
2.ingress:
入站流量规则,可以根据ports和from。ports(被访问端口):指定目标端口和协议,如果这个字段为空或丢失,此规则匹配所有端口from(来自哪个地址):地址分为ip地址段、pod、namespace,如果from字段为空或丢失,此规则匹配所有源
3.podSelector:
定义NetworkPolicy的限制范围。直白的说就是规则应用到哪个pod上。podSelector: {},空的podselector匹配所有此命名空间中的pods。没有定义白名单的话 默认就是Deny ALL (拒绝所有)
4.policyTypes:
指定那个规则 那个规则生效,不指定就是默认规则。

example:

在两个名称空间测试网络策略

Ingress测试

  1. 建立名称空间

     ]# kubectl create namespace dev
     ]# kubectl create namespace prod
    
  2. 建立网络策略ingress-def.yaml

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      podSelector: {} #空的podselector匹配所有此命名空间中的pods
      policyTypes: 
      - Ingress #表示只对ingress生效,但是ingress策略丢失(没有设置)则此策略默认拒绝所有,且podSelector设置为空,故表示规则所在名称空间的所有pods,拒绝所有入站请求
        #但是我们这里面又没有加egress,所以默认egress是允许所有的
        
    ]# kubectl apply -f ingress-def.yaml -n dev  
    networkpolicy.networking.k8s.io/deny-all-ingress created
    ]# kubectl get netpol -n dev
    NAME               POD-SELECTOR   AGE
    deny-all-ingress            1m
    
  3. 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
    pod/pod1 created
    ]# kubectl get pods -n dev -o wide
    NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
    pod1      1/1       Running   0          1m        10.244.2.2   node2
    ]# curl 10.244.2.2   #无法访问目标
    
  4. 修改策略测试

    ]# cat ingress-def.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all-ingress
    spec:
      podSelector: {} 
      ingress:
      - {} #设置此策略且为空表示允许所有入站访问
      policyTypes:
      - Ingress #表示只对ingress生效
        #但是我们这里面又没有加egress,所以默认egress是允许所有的
        
    ]# kubectl apply -f ingress-def.yaml -n dev
    networkpolicy.networking.k8s.io/deny-all-ingress configured
    ]# curl 10.244.2.2 #这时我们就能在宿主机上访问到dev名称空间的pod
    Hello MyApp | Version: v1 | Pod Name
    

    测试完成还原策略:

    ]# curl 10.244.2.2 #不能访问
    
  5. prod名称空间建立pod

    ]# kubectl apply -f pod-a.yaml  -n prod
    pod/pod1 created
    ]# kubectl get pods -n prod -o wide
    NAME      READY     STATUS    RESTARTS   AGE       IP           NODE
    pod1      1/1       Running   0          1m        10.244.2.3   node2
    ]# curl 10.244.2.3 #由于该名称空间并没有定义规则,可以正常通信
    Hello MyApp | Version: v1 | Pod Name
    

    定义具体规则测试ingress

    ]# kubectl label pods pod1 app=myapp -n dev  #为pod1定义labels	
    pod/pod1 labeled
    ]# 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 #指定网段,允许从10.244.0.0/16入站到pod里面
            except:
            - 10.244.1.2/32 #排除这个地址
        ports:
        - protocol: TCP
          port: 80
          
    ]# kubectl apply -f allow-netpol-demo.yaml -n dev
    networkpolicy.networking.k8s.io/allow-myapp-ingress created
    ]# kubectl get netpol -n dev
    NAME                  POD-SELECTOR   AGE
    allow-myapp-ingress   app=myapp      1m
    deny-all-ingress               5h
    ]# curl 10.244.2.2 #生效allow-myapp-ingress网络策略后,可以正常访问dev:pod1
    Hello MyApp | Version: v1 | Pod Name
    

Egress测试

]# cat egress-def.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-egress
spec:
  podSelector: {} #pod选择器设置为空,表示选择所有pod,即控制整个名称空间
  policyTypes:
  - Egress #表示只对egress生效,Egress策略丢失(没有设置)则此策略默认拒绝所有


]# kubectl apply -f egress-def.yaml -n prod
networkpolicy.networking.k8s.io/deny-all-egress created
]# kubectl get pods -n prod
]# kubectl exec pod1 -it  -n prod -- /bin/sh
/ # ping 10.244.0.45
PING 10.244.0.45 (10.244.0.45): 56 data bytes     #请求被拒绝策略生效

]# cat egress-def.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-egress
spec:
  podSelector: {} 
  egress:
  - {} #表示允许所有egress出去的流量
  policyTypes:
  - Egress #表示只对egress生效
 
]# kubectl apply -f egress-def.yaml -n prod
]# kubectl exec pod1 -it  -n prod -- /bin/sh
/ # ping 10.244.0.45
PING 10.244.0.45 (10.244.0.45): 56 data bytes
64 bytes from 10.244.0.45: seq=0 ttl=62 time=0.227 ms
64 bytes from 10.244.0.45: seq=1 ttl=62 time=0.284 ms

参考文档:http://blog.itpub.net/28916011/viewspace-2215383/

你可能感兴趣的:(运维,k8s)