4.k8s-配置网络策略 NetworkPolicy

发布时间 2024-01-11 14:04:05作者: 杨梅冲

一、基本了解

官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
基本了解: 1.网络策略通过网络插件来实现,创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的,而我们搭建K8s集群时安装的calico网络组件就支持网络策略 2.默认情况下,K8s 集群网络没任何网络限制,Pod 可以与任何其他 Pod 通信,在某些场景下就需要进行网络控制,减少网络攻击面,提高安全性,这就会用到网络策略。 3.网络策略是一个K8s资源,需要管理员写yaml定义规则的,用于限制Pod出入流量,提供Pod级别和Namespace级别网络访问控制。 应用场景: 1.应用程序间的访问控制,例如项目A不能访问项目B的Pod。 2.开发环境命名空间不能访问测试环境命名空间Pod。 3.当Pod暴露到外部时,需要做Pod白名单。 4.多租户网络环境隔离。 网络策略工作流程: 1. 使用kubectl提交yaml文件给api server创建Network Policy资源。 2. api server 收到之后存到etcd数据库中。 3. Policy Controller组件监控网络策略,同步并通知节点上程序。 4. 节点上DaemonSet运行的程序从etcd中获取Policy,调用本地Iptables创建防火墙规则 注意事项: 1.calico网络组件是以Daemonset方式部署到每个节点,其中红色框的pod负责calico录入表的维护,网络策略的执行和下发。 2.有的网络组件没有controllers控制器:calico-kube-controllers,只有agent-pod:calico-node 3.也有特定需求是网络策略当前实现不了的,可以通过操作系统组件、准入控制器来实现
题目一:
设置配置环境: [candidate@node
-1] $ kubectl config use-context hk8s Task 在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。 确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。 进一步确保新的 NetworkPolicy: -- 不允许对没有在监听 端口 9000 的 Pods 的访问 -- 不允许非来自 namespace echo 中的 Pods 的访问
# 解答:
# 1.更换配置环境
kubectl config use-context hk8s
# 如果没有创建名称空间:创建名称空间
kubectl create ns my-app
kubectl create ns echo

# 2.查看 namespace echo 的标签
[root@master2 etcd]# kubectl get ns --show-labels
NAME              STATUS   AGE    LABELS
echo              Active   19s    kubernetes.io/metadata.name=echo
my-app            Active   18m    kubernetes.io/metadata.name=my-app

# 如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用。
[root@master2 etcd]# kubectl label ns echo project=echo
namespace/echo labeled

[root@master2 etcd]# kubectl get ns --show-labels
NAME              STATUS   AGE    LABELS
echo              Active   90s    kubernetes.io/metadata.name=echo,project=echo
my-app            Active   19m    kubernetes.io/metadata.name=my-app

# 3.创建 networkpolicy
vim networkpolicy.yaml apiVersion: networking.k8s.io
/v1 kind: NetworkPolicy metadata: name: allow-port-from-namespace namespace: my-app #被访问者的命名空间 spec: podSelector: #这两行必须要写,或者也可以写成一行为 podSelector: {} matchLabels: {} # 注意 matchLabels:与{}之间有一个空格 policyTypes: - Ingress #策略影响入栈流量 ingress: - from: #允许流量的来源 - namespaceSelector: matchLabels: project: echo #访问者的命名空间的标签 label #- podSelector: {} #注意,这个不写。如果 ingress 里也写了- podSelector: {},则会导致 my-app 中的 pod 可以访问 my-app 中 pod 的 9000 了,这样不 满足题目要求不允许非来自 namespace echo 中的 Pods 的访问。 ports: - protocol: TCP port: 9000 #被访问者公开的端口 [root@master2 networkpolicy]# kubectl apply -f networkpolicy.yaml networkpolicy.networking.k8s.io/allow-port-from-namespace created [root@master2 networkpolicy]# kubectl describe networkpolicy -n my-app Name: allow-port-from-namespace Namespace: my-app Created on: 2024-01-11 13:28:35 +0800 CST Labels: <none> Annotations: <none> Spec: PodSelector: <none> (Allowing the specific traffic to all pods in this namespace) Allowing ingress traffic: To Port: <any> (traffic allowed to all ports) From: NamespaceSelector: project=echo ---------- To Port: 9000/TCP From: <any> (traffic not restricted by source) Not affecting egress traffic Policy Types: Ingress
题目二:
设置配置环境kubectl config use-context k8s

创建一个名为allow-port-from-namespace2的新NetworkPolicy,以允许现有namespace my-app中的Pods连接到同一namespace中其他pods的端口9200。

确保新的NetworkPolicy:
-- 不允许对没有在监听端口9200的pods访问
-- 不允许不来自namespace my-app的pods的访问
# 解答1.切换环境:
kubectl config use-context k8s

#2. 查看my-app标签以及如果没有就打上标签
[root@master k8s]# kubectl label ns my-app project=my-app
namespace/my-app labeled

# 3.编写networkpolicy-2.yaml文件
[root@master2 networkpolicy]# cat networkpolicy-2.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace2
  namespace: my-app
spec:
  podSelector:
    matchLabels: { }
  policyTypes:
  - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: my-app
      ports:
        - protocol: TCP
          port: 9200

[root@master2 networkpolicy]# kubectl apply -f networkpolicy-2.yaml 
networkpolicy.networking.k8s.io/allow-port-from-namespace2 created
[root@master2 networkpolicy]# kubectl describe networkpolicy allow-port-from-namespace2 -n my-app
Name:         allow-port-from-namespace2
Namespace:    my-app
Created on:   2024-01-11 13:54:30 +0800 CST
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
  Allowing ingress traffic:
    To Port: 9200/TCP
    From:
      NamespaceSelector: project=my-app
  Not affecting egress traffic
  Policy Types: Ingress