一、前言

NetworkPolicy(网络策略)是基于网络插件来实现的,默认情况下,整个集群中所有的pod都是可以互通的,但是针对一些特殊的需求,我们就需要用网络策略来对相应的pod做出隔离。NetworkPolicy依赖于网络插件,但不是所有的网络插件都支持网络策略,比如:calico支持网络策略,而flannel不支持。

二、K8S网络类型的更改

1. 查看当前集群的网络类型

[root@master ~]# cat /etc/cni/net.d/10-flannel.conflist 
{
  "name": "cbr0",
  "cniVersion": "0.3.1",
  "plugins": [
    { #类型为flannel 不支持网络策略需更改
      "type": "flannel", 
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

2. 更改网络类型

卸载flannel(使用最开始创建的yaml文件)
[root@master ~]# kubectl delete -f /home/yaml/flannel/kube-flannel.yaml 
podsecuritypolicy.policy "psp.flannel.unprivileged" deleted
clusterrole.rbac.authorization.k8s.io "flannel" deleted
clusterrolebinding.rbac.authorization.k8s.io "flannel" deleted
serviceaccount "flannel" deleted
configmap "kube-flannel-cfg" deleted
daemonset.apps "kube-flannel-ds" deleted

删除网卡(master节点和node节点都要执行)
[root@master ~]# ip link delete cni0
[root@master ~]# ip link delete flannel.1

三、部署calico网络

1. 下载calico网络需要用到的镜像

[root@master ~]# docker pull docker.io/calico/cni:v3.21.1 
[root@master ~]# docker pull docker.io/calico/pod2daemon-flexvol:v3.21.1
[root@master ~]# docker pull docker.io/calico/node:v3.21.1
[root@master ~]# docker pull docker.io/calico/kube-controllers:v3.21.1

2. 下载calico网络的yaml部署文件

[root@master ~]#  wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate

查看镜像是否正确
[root@master ~]# cat calico.yaml | grep image
          image: docker.io/calico/cni:v3.21.1
          image: docker.io/calico/cni:v3.21.1
          image: docker.io/calico/pod2daemon-flexvol:v3.21.1
          image: docker.io/calico/node:v3.21.1
          image: docker.io/calico/kube-controllers:v3.21.1
 
部署calico网络
[root@master ~]# kubectl apply -f calico.yaml 

查看pod是否正常运行
[root@master ~]# kubectl get pods -A
NAMESPACE              NAME                                         READY   STATUS             RESTARTS   AGE
kube-system            calico-kube-controllers-77ff9c69dd-gpdj7     1/1     Running            0          28m
kube-system            calico-node-8glhl                            1/1     Running            0          28m
kube-system            calico-node-8sjj2                            1/1     Running            0          28m

四、NetworkPolicy的应用

1. NetworkPolicy资源示例

[root@master ~]# vi networkpolicy.yaml 
apiVersion: networking.k8s.io/v1 #版本信息
kind: NetworkPolicy #资源名称
metadata:#元数据信息
  name: network-policy
  namespace: default #名称空间
spec:
  podSelector: #选择做策略的pod
    matchLabels: #通过标签来进行选择
      app: busybox1
  policyTypes:#设置策略类型为进站或者出战
  - Ingress
  - Egress
  ingress:#设置进站规则白名单(没写该规则表示拒绝所有)
  - from:
    - ipBlock: #通过网段来进行匹配
        cidr: 10.244.0.0/16 #设置网段或者主机
        except: #设置不能够访问的主机
        - 10.244.1.0/24
    - namespaceSelector: #通过名称空间来匹配
        matchLabels: #通过名称空间标签来进行选择
          project: ns#该名称空间下所有pod都可以访问
    - podSelector:#通过pod标签来匹配,只能够匹配当前名称空间下的
        matchLabels:
          app: busyboxy-admin
    ports:#端口规则匹配
    - port: 80 #只能够访问该pod的80端口
      protocol: TCP#使用的协议为TCP
  egress:#设置出战规则白名单(没写该规则表示拒绝所有)
  - to:
    - ipBlock:#设置该pod对外请求的网段
        cidr: 10.244.0.0/24
    ports:#对外请求的端口
    - port: 80
      protocol: TCP

2. 允许所有入站和出站的流量

可以根据需要进行设置 这里只是展示怎样写
[root@master ~]# vi allow.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - {}
  egress:
  - {}

3. 拒绝所有入站和出战的流量

[root@master ~]# vi deny.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny 
  namespace: default
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐