【云原生、k8s】Calico网络策略

第四阶段

时 间:2023年8月17日

参加人:全班人员

内 容:

Calico网络策略

目录

一、前提配置

二、Calico网络策略基础

1、创建服务

2、启用网络隔离

3、测试网络隔离

4、允许通过网络策略进行访问

三、Calico网络策略进阶

1、创建服务

2、拒绝所有入口流量

3、允许进入Nginx的流量

4、拒绝所有出口流量

5、允许DNS出口流量

6、允许出口流量到Nginx


一、前提配置

1、主机初始化设置

复制代码
[root@k8s-master ~]# iptables -F

[root@k8s-master ~]# setenforce 0

[root@k8s-master ~]# systemctl stop firewalld

[root@k8s-master ~]# free

[root@k8s-master ~]# sysctl -p

2、安装部署k8s集群,并使用calico网络

root@k8s-master \~# kubectl get nodes

root@k8s-master \~# kubectl get pods -n kube-system

二、 Calico网络策略基础

1、创建服务

1) 创建命名空间

root@k8s-master \~# kubectl create ns policy-demo

2) 在 policy-demo 命名空间中创建两个副本的 Nginx Pod。

root@k8s-master \~# vim nginx-deployment.yaml

root@k8s-master \~# kubectl apply -f nginx-deployment.yaml

root@k8s-master \~# kubectl get pod -n policy-demo

3) 通过服务暴露 Nginx 的 80 端口。

root@k8s-master \~# kubectl expose --namespace=policy-demo deployment nginx --port=80

root@k8s-master \~# kubectl get all -n policy-demo

4) 通过 busybox 的 Pod 去访问 Nginx 服务。

root@k8s-master \~# kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh

/ # wget -q nginx -O -

root@k8s-master \~# kubectl get all -n policy-demo

2、启用网络隔离

在 policy-demo 命名空间中打开隔离。然后 Calico 将阻止连接到该命名空间中的 Pod。执行以下命令将创建一个 NetworkPolicy,该策略将对 policy-demo 名称空间中的所有 Pod实现默认的拒绝行为。

复制代码
[root@k8s-master ~]# kubectl create -f - <<EOF

kind: NetworkPolicy

apiVersion: networking.k8s.io/v1

metadata:

  name: default-deny

  namespace: policy-demo

spec:

  podSelector:

    matchLabels: {}

EOF

3、测试网络隔离

启用网络隔离后,所有对 Nginx 服务的访问都将阻止。执行以下命令,尝试再次访问Nginx 服务,查看网络隔离的效果。

/ # wget -q --timeout=5 nginx -O -

4、允许通过网络策略进行访问

使用 NetworkPolicy 启用对 Nginx 服务的访问。设置允许从 accessPod 传入的连接,但不能从其他任何地方传入。创建 access-nginx 的网络策略具体内容如下所示。

复制代码
[root@k8s-master ~]# kubectl create -f - <<EOF

kind: NetworkPolicy

apiVersion: networking.k8s.io/v1

metadata:

  name: access-nginx

  namespace: policy-demo

spec:

  podSelector:

    matchLabels:

      app: nginx

  ingress:

    - from:

      - podSelector:

          matchLabels:

            run: access

EOF

从 accessPod 访问该服务。

root@k8s-master \~# kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh

/ # wget -q --timeout=5 nginx -O -

如果没有标记access,仍然无法访问服务。

root@k8s-master \~# kubectl run --namespace=policy-demo cant-access --rm -ti --image busybox /bin/sh

/ # wget -q --timeout=5 nginx -O -

root@k8s-master \~# kubectl get all -n policy-demo

三、 Calico网络策略进阶

1、创建服务

删除命令空间 policy-demo,创建新的命名空间 advanced-policy-demo。

root@k8s-master \~# kubectl delete ns policy-demo

root@k8s-master \~# kubectl create ns advanced-policy-demo

使用 YAML 文件创建 Nginx 服务。

root@k8s-master \~# vim nginx-deployment.yaml

root@k8s-master \~# kubectl apply -f nginx-deployment.yaml

root@k8s-master \~# kubectl expose --namespace=advanced-policy-demo deployment nginx --port=80

root@k8s-master \~# kubectl get all -n advanced-policy-demo

验证访问权限并访问百度测试外网连通性。

root@k8s-master \~# kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

/ # wget -q --timeout=5 nginx -O -

/ # wget -q --timeout=5 www.baidu.com -O -

root@k8s-master \~# kubectl get all -n advanced-policy-demo

2、拒绝所有入口流量

设置网络策略,要求 Nginx 服务拒绝所有入口流量。然后进行访问权限的验证。

复制代码
[root@k8s-master ~]# kubectl create -f - <<EOF

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: default-deny-ingress

  namespace: advanced-policy-demo

spec:

  podSelector:

    matchLabels: {}

  policyTypes:

  - Ingress

EOF

root@k8s-master \~# kub w.baidu.com -O -

从上述命令执行结果中可以看出,对 Nginx 服务的入口访问被拒绝,而仍然允许对出站 Internet 的出口访问。

3、允许进入Nginx的流量

执行以下命令,创建一个 NetworkPolicy,设置允许流量从 advanced-policy-demo 命名空间中的任何 Pod 到 Nginx Pod。创建策略成功后,就可以访问 Nginx 服务了。

复制代码
[root@k8s-master ~]# kubectl create -f - <<EOF

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: access-nginx

  namespace: advanced-policy-demo

spec:

  podSelector:

    matchLabels:

      app: nginx

  ingress:

    - from:

      - podSelector:

          matchLabels: {}

EOF

root@k8s-master \~# kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

/ # wget -q --timeout=5 nginx -O -

/ # wget -q --timeout=5 www.baidu.com -O -

4、拒绝所有出口流量

设置拒绝所有出口流量的网络策略,该策略设置成功后,任何策略未明确允许的入站或出站流量都将被拒绝。

复制代码
[root@k8s-master ~]# kubectl create -f - <<EOF

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: default-deny-egress

  namespace: advanced-policy-demo

spec:

  podSelector:

    matchLabels: {}

  policyTypes:

  - Egress

EOF

root@k8s-master \~# kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

/ # nslookup nginx

/ # wget -q --timeout=5 nginx -O -

/ # wget -q --timeout=5 www.baidu.com -O -

5、允许DNS出口流量

执行以下命令,在 kube-system 名称空间上创建一个标签。该标签的 NetworkPolicy允许 DNS 从 advanced-policy-demo 名称空间中的任何 Pod 到名称空间 kube-system 的出站流量。

root@k8s-master \~# kubectl label namespace kube-system name=kube-system

复制代码
[root@k8s-master ~]# kubectl create -f - <<EOF

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: allow-dns-access

  namespace: advanced-policy-demo

spec:

  podSelector:

    matchLabels: {}

  policyTypes:

  - Egress

  egress:

  - to:

    - namespaceSelector:

        matchLabels:

          name: kube-system

    ports:

    - protocol: UDP

      port: 53

EOF

root@k8s-master \~# kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

/ # nslookup nginx

/ # nslookup www.baidu.com

即使DNS 出口流量被允许,但来自 Advanced-policy-demo 命名空间中所有 Pod 的所有其他出口流量仍被阻止。因此,来自 wget 调用的 HTTP 出口流量仍将失败。

/ # wget -q --timeout=5 nginx -O -

6、允许出口流量到Nginx

执行以下命令,创建一个 NetworkPolicy,允许从 advanced-policy-demo 名称空间中的任何 Pod 到具有 app: nginx 相同名称空间中标签匹配的 Pod 的出站流量。

复制代码
[root@k8s-master ~]# kubectl create -f - <<EOF

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: allow-egress-to-advance-policy-ns

  namespace: advanced-policy-demo

spec:

  podSelector:

    matchLabels: {}

  policyTypes:

  - Egress

  egress:

  - to:

    - podSelector:

        matchLabels:

          app: nginx

EOF

root@k8s-master \~# kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

/ # wget -q --timeout=5 nginx -O -

/ # wget -q --timeout=5 www.baidu.com -O -

访问百度超时,是因为它可以解决 DNS 匹配标签以外的其他任何出口访问 app: nginx的 advanced-policy-demo 命名空间。

相关推荐
稳联技术老娜3 小时前
DeviceNet主站怎么连接西门子PLC,Profinet网关配置手册(那智机器人)
服务器·网络·数据库
这个DBA有点耶4 小时前
云上运维新挑战:当数据库不再“看得见摸得着”
数据库·sql·程序人生·云原生·运维开发·学习方法·dba
志栋智能5 小时前
AI驱动无代码:降低巡检超自动化的门槛
大数据·运维·网络·人工智能·自动化
专业机床数据采集5 小时前
C# 精雕数控 数据采集 Demo|实时读取精雕机床坐标、主轴、负载、加工工时全量参数
网络·网络协议·tcp/ip·mes·精雕数控数据采集
AOwhisky6 小时前
Ceph系列第六期:Ceph 文件系统(CephFS)精讲
linux·运维·网络·笔记·ceph
我爱C编程6 小时前
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
网络·matlab·ecc·密钥管理·无线传感器网络·簇内分组
Sagittarius_A*7 小时前
H3CSE 高性能园区网:园区网安全体系详解
网络·计算机网络·安全·h3cse
做个文艺程序员9 小时前
第02篇:K8s 存储与配置管理:ConfigMap、Secret、PV/PVC 实战——Java SaaS 多租户配置最佳实践
java·容器·kubernetes
安全检测中10 小时前
探讨一个OSPF中NSSA类型的问题
网络
luj_176810 小时前
R语言生态优势与学习曲线分析
c语言·开发语言·网络·经验分享·算法