Kubernetes中kube-node-lease命名空间NetworkPolicy配置与Pod重启权限的最佳实践咨询
作为刚接触Kubernetes的新手,你这个问题问得很到位——NetworkPolicy的配置很容易不小心限制了必要的系统流量,不过先给你吃个定心丸:
关于kube-node-lease是否会影响Pod重启的问题
完全不用担心Pod无法正常重启!原因在于:Pod的重启是由节点上的kubelet直接负责的,它不需要从kube-node-lease命名空间发起入站请求到你的Nginx Pod。kube-node-lease的作用是节点向kube-apiserver发送心跳信号,和Pod的重启流程没有直接的入站流量交互。你的NetworkPolicy只限制了外部入站到Nginx Pod的流量,而kubelet在本地重启Pod的操作不受这个规则的约束。
不过如果你的Pod有自定义的逻辑依赖kube-node-lease的流量(比如某些特殊监控),那另当别论,但默认场景下完全没问题。
授予必要访问权限的最佳实践方案(除了给kube-node-lease加标签)
如果要避免遗漏系统组件的必要访问,同时保持你的隔离策略,这里有几个实用的方案:
允许节点IP段的流量:集群内的核心组件(比如kubelet、kube-proxy)都运行在节点上,直接允许节点IP段的入站流量,能覆盖绝大多数系统级访问需求。修改你的NetworkPolicy:
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-different-namespace-policy namespace: isolation spec: podSelector: matchLabels: app: nginx ingress: - from: - namespaceSelector: matchLabels: env: test - ipBlock: cidr: 192.168.0.0/16 # 替换成你集群的节点实际IP段匹配系统命名空间的默认标签:Kubernetes的系统命名空间(比如
kube-system、kube-node-lease)都带有默认标签kubernetes.io/metadata.name: <命名空间名>,直接通过这个标签允许流量,不用手动添加自定义标签:ingress: - from: - namespaceSelector: matchLabels: env: test - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-node-lease这种方式更贴合Kubernetes的默认配置,后续集群升级也不用担心标签丢失的问题。
精细控制到Pod级别的访问:如果不想开放整个系统命名空间的访问,可以组合
namespaceSelector和podSelector,只允许特定组件的Pod访问。比如允许kube-dns访问:ingress: - from: - namespaceSelector: matchLabels: env: test - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns设置默认拒绝+按需允许的策略:先给
isolation命名空间设置一个默认拒绝所有入站流量的NetworkPolicy,再逐个添加允许的规则,这样能最大限度保证安全性:# 默认拒绝所有入站流量 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: default-deny-ingress namespace: isolation spec: podSelector: {} policyTypes: - Ingress然后再保留你原来的允许test命名空间的规则,按需添加系统组件的访问规则,避免无意识的流量泄漏。
内容的提问来源于stack exchange,提问作者pysquirrel

