总目录索引:K8s网络Calico 从入门到放弃系列

1、创建服务

kubectl create ns advanced-policy-demo

由于k8s的v1.18.2版本弃用了replicas命令,使用yaml文件创建nginx服务

vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: advanced-policy-demo
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80        
kubectl apply -f nginx-deployment.yaml

创建nginx的服务并暴露80端口

kubectl expose --namespace=advanced-policy-demo deployment nginx --port=80

验证访问权限

kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

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

Calico网络进阶_calico网络进阶篇

并访问百度测试

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

Calico网络进阶_calico网络进阶篇_02

2、拒绝所有入口流量

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

2.1验证访问权限

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 -

Calico网络进阶_calico网络进阶篇_03

可以看到,对Nginx服务的入口访问被拒绝,而仍然允许对出站Internet的出口访问。

3、允许进入nginx的流量

运行以下命令以创建一个NetworkPolicy,允许流量从advanced-policy-demo命名空间中的任何Pod到Nginx Pod 

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

验证访问nginx服务

kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

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

Calico网络进阶_calico网络进阶篇_04

创建策略后,我们现在可以访问nginx服务。

4、拒绝所有出口流量

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

4.1 验证访问权限,拒绝所有出口

现在,任何策略未明确允许的入站或出站流量都将被拒绝。

kubectl run --namespace=advanced-policy-demo access --rm -ti --image busybox /bin/sh

nslookup nginx

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

Calico网络进阶_calico网络进阶篇_05

5、允许DNS出口流量

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

kubectl label namespace kube-system name=kube-system

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

5.1 验证访问权限-允许DNS访问

nslookup nginx

nslookup www.baidu.com

Calico网络进阶_calico网络进阶篇_06

    即使DNS出口流量现在正在工作,来自Advanced-policy-demo命名空间中所有pod的所有其他出口流量仍被阻止。因此,来自wget调用的HTTP出口流量仍将失败

6、允许出口流量到nginx

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

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

6.1 验证访问权限-允许对nginx进行出口访问

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

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

Calico网络进阶_calico网络进阶篇_07

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

7、清理名称空间

kubectl delete ns advanced-policy-demo

参考文章:https://docs.projectcalico.org/security/tutorials/kubernetes-policy-advanced