第四阶段
时 间: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 命名空间。