云原生|kubernetes|networkPolicy网络策略详解

简介: 云原生|kubernetes|networkPolicy网络策略详解

前言:

networkPolicy是kubernetes集群的一个重要安全特性。顾名思义,网络策略,控制网络流量的一个资源。

那么,kubernetes集群的网络是由docker虚拟网卡,cni网络插件,flannel网络插件(也可能会使用calico,weaver等等其它网络插件)这些模块组成的。

主要还是基于Linux内核层面的iptables或者ipvs通过上述的网络插件使得整个集群的网络成为网络层次有若干个子网的,内部是可以跨节点,跨子网段的一个整体网络。

例如,我有一个kubeadm部署的集群,集群内部网络如下:

两个子网段,10.244.36 和10.244.169

root@k8s-master:~# kubectl get po -A -owide
NAMESPACE       NAME                                       READY   STATUS    RESTARTS         AGE     IP                NODE         NOMINATED NODE   READINESS GATES
a               a                                          1/1     Running   1 (5m27s ago)    13h     10.244.36.76      k8s-node1    <none>           <none>
b               b                                          1/1     Running   1 (5m27s ago)    13h     10.244.36.69      k8s-node1    <none>           <none>
default         busybox                                    1/1     Running   0                49s     10.244.36.79      k8s-node1    <none>           <none>
default         front-end-5f64577768-tsq76                 1/1     Running   14 (5m27s ago)   9d      10.244.36.75      k8s-node1    <none>           <none>
default         guestbook-86bb8f5bc9-2nk6c                 1/1     Running   13 (5m27s ago)   8d      10.244.36.82      k8s-node1    <none>           <none>
default         guestbook-86bb8f5bc9-2xrh6                 1/1     Running   13 (5m27s ago)   8d      10.244.36.78      k8s-node1    <none>           <none>
default         guestbook-86bb8f5bc9-78pq5                 1/1     Running   13 (5m27s ago)   8d      10.244.36.73      k8s-node1    <none>           <none>
default         guestbook-86bb8f5bc9-m4wr4                 1/1     Running   14 (5m21s ago)   9d      10.244.169.153    k8s-node2    <none>           <none>
default         guestbook-86bb8f5bc9-pkzpl                 1/1     Running   14 (5m21s ago)   9d      10.244.169.152    k8s-node2    <none>           <none>
default         guestbook-86bb8f5bc9-sq4xf                 1/1     Running   13 (5m21s ago)   8d      10.244.169.155    k8s-node2    <none>           <none>
剩下的略略略

OK,此时在集群内部启动一个临时的pod,以上的集群内部IP是都可以ping通的:

kubectl run busybox -it --rm  --image=busybox -- /bin/sh
/ # ping 10.244.36.80 -c 2
PING 10.244.36.80 (10.244.36.80): 56 data bytes
64 bytes from 10.244.36.80: seq=0 ttl=63 time=0.119 ms
64 bytes from 10.244.36.80: seq=1 ttl=63 time=0.129 ms
--- 10.244.36.80 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.124/0.129 ms
ping 10.244.169.147 -c 2
PING 10.244.169.147 (10.244.169.147): 56 data bytes
64 bytes from 10.244.169.147: seq=0 ttl=62 time=0.737 ms
64 bytes from 10.244.169.147: seq=1 ttl=62 time=0.802 ms

那就说明了一个问题,kubernetes集群的网络是一个自由的,无任何限制的网络,很显然,这样的网络是没有安全性可言的,因为,任意一个pod都可以连接到其它的pod,那么,如果有某一个不受控制的黑客部署的pod在集群内,不是非常的不安全吗?

其实说了这么多,基于网络插件比如calico的networkPolicy会对集群内的网络做一个细粒度的控制,例如,控制某类带有特定标签的pod能够访问其它的指定的pod,简单的说人话就是能够做一定的网络隔离。

Kubernetes提供了NetworkPolicy,支持按Namespace和按Pod级别的网络访问控制。它利用label指定namespaces或pod,底层用iptables实现。不是所有的 Kubernetes 网络方案都支持 Network Policy。比如 Flannel 就不支持,Calico 是支持的。

例如,calico网络方案的networkPolicy工作流程是这样的:

a.通过kubectl client创建network policy资源;
b.calico的policy-controller监听network policy资源,获取到后写入calico的etcd数据库;
c.node上calico-felix从etcd数据库中获取policy资源,调用iptables做相应配置。

使用network policy资源可以配置pod的网络,networkPolicynamespace scoped的,他只能影响某个namespace下的pod的网络出入站规则。

你首先需要有一个支持网络策略的 Kubernetes 集群。已经有许多支持 NetworkPolicy 的网络提供商,包括:




一,

ingress和egress

ingress 表示进口流量,egress表示出口流量,入口流量和出口流量都是相对networkPolcy所指定的namespace来说的,例如下面这个policy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

以上这个policy意思是所有具有标签 access=true的pod才可以访问namespace为default的所有具有pod 标签 app=nginx的pod

OK,此时查看default这个命名空间下的所有pod的具有app=nginx的pod:

root@k8s-master:~# kubectl get po -owide --show-labels |grep nginx
nginx-6799fc88d8-ktjxh                    1/1     Running   5 (80m ago)    8d      10.244.169.140   k8s-node2    <none>           <none>            access=true,app=nginx,pod-template-hash=6799fc88d8
nginx-kusc0041                            1/1     Running   11 (80m ago)   12d     10.244.169.141   k8s-node2    <none>           <none>            run=nginx-kusc0041
task-2-ds-fcm5l                           1/1     Running   13 (80m ago)   14d     10.244.235.193   k8s-master   <none>           <none>            controller-revision-hash=688c88fb84,nginx=task-2-ds,pod-template-generation=1
task-2-ds-nwdlv                           1/1     Running   19 (80m ago)   18d     10.244.169.135   k8s-node2    <none>           <none>            controller-revision-hash=688c88fb84,nginx=task-2-ds,pod-template-generation=1
task-2-ds-pmlqw                           1/1     Running   19 (80m ago)   18d     10.244.36.81     k8s-node1    <none>           <none>            controller-revision-hash=688c88fb84,nginx=task-2-ds,pod-template-generation=1

此时,带标签access=true的pod可以访问140,如果不带access=true,将不可以访问140

不带标签的时候:

kubectl run test -it --rm --image=busybox  -- /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget 10.244.169.141
Connecting to 10.244.169.141 (10.244.169.141:80)
saving to 'index.html'
index.html           100% |***************************************************************************************************************************************|   615  0:00:00 ETA
'index.html' saved
/ # wget 10.244.169.140
Connecting to 10.244.169.140 (10.244.169.140:80)
^C

带符合的标签的时候:

root@k8s-master:~# kubectl run test -it --rm --image=busybox --labels="access=true" -- /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget 10.244.169.140
Connecting to 10.244.169.140 (10.244.169.140:80)
saving to 'index.html'
index.html           100% |***************************************************************************************************************************************|   615  0:00:00 ETA
'index.html' saved

那么,有一点需要注意了,podSelector 前面加  -号和 不加-号的,如有-号表示范围扩大,这个时候是两个条件任意一个符合即可(逻辑关系是或)。如无-号表示精确匹配pod的label标签(逻辑关系是与),还是以上面的例子为例:

无减号,表示精确的匹配

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - namespaceSelector: {}
      podSelector:
        matchLabels:
          access: "true"

有减号,表示或者,范围匹配

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - namespaceSelector: {}
    - podSelector:
        matchLabels:
          access: "true"

二,

实验1:

创建一个networkPolicy,使得名为a的namespace内的pod全部隔离,只有具有标签 access=true的pod才可以访问a namespace内的其它pod

网络策略未创建前:

OK,先创建名为a的namespace,并且在该namespace内创建两个都使用nginx镜像的名称分别为nginx1和nginx2

kubectl create ns a
kubectl run nginx1 --image=nginx -n a
kubectl run nginx2 --image=nginx -n a

查看pod的状态,可以看到有绑定两个IP,分别是10.244.36.86,10.244.36.96

root@k8s-master:~# kubectl get po -n   a  -owide 
NAME     READY   STATUS    RESTARTS       AGE     IP             NODE        NOMINATED NODE   READINESS GATES
nginx1   1/1     Running   1 (123m ago)   4h39m   10.244.36.86   k8s-node1   <none>           <none>
nginx2   1/1     Running   0              97m     10.244.36.96   k8s-node1   <none>           <none>

OK,这个时候我们进入nginx1,看看a 这个namespace内的pod是否互相隔离:

进入pod的命令:

kubectl exec -it po -n a nginx1 -- /bin/sh

可以发现,两个pod之间是可以直接互相访问的,没有任何的阻碍,当然了,其它的namespace内的pod也是没有任何阻碍的可以访问到

# curl 10.244.36.96
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
# curl 10.244.36.86
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

网络策略创建后:

root@k8s-master:~# cat test.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
  namespace: a
spec:
  podSelector: {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

OK,这个网络策略表示名为a的namespace内的所有pod互相直接隔离,只有具有access=true的pod才可以访问a 这个namespace内的其它的pod。

上述文件执行后,此时,在进入nginx1,可以发现无法访问nginx2了:

# curl 10.244.36.96        
^C

但可以自由的访问其它的namespace内的pod,证明网络策略的作用范围只在a 这个namespace内:

root@k8s-master:~# kubectl get po -A -owide |grep  10.244.169.151
default         nginx-6799fc88d8-ktjxh                     1/1     Running   2 (141m ago)    22h     10.244.169.151    k8s-node2    <none>           <none>
curl 10.244.169.151
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }

OK,现在给nginx1增加符合网络策略进入策略的标签acces=true,然后登陆nginx1,再次访问nginx2,可以发现可以正常访问了:

给nginx1添加标签:

kubectl label po -n a nginx1 access=true
root@k8s-master:~# kubectl get po -n a nginx1 --show-labels 
NAME     READY   STATUS    RESTARTS       AGE    LABELS
nginx1   1/1     Running   1 (152m ago)   5h8m   access=true,run=nginx1

再次访问,可以发现恢复正常了,证明网络策略是生效了。

# curl 10.244.36.96
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

由以上实验我们可以得出一个结论:

1,namespace是networkPolicy的作用域

2,from表示方向,因此,上面的例子,标签是打在了nginx1,然后登陆的nginx1,那么,如果标签打到了nginx2上,就需要使用nginx2访问nginx1了。

三,

实验2

某个namespace(这里还是使用a这个namespace),拒绝所有的入站流量和出站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: a
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

此时,在default这个namespace里有一个nginx,登陆这个pod,可以发现a这个namespace里的所有pod都无法访问了:

root@k8s-master:~# kubectl get po -owide
NAME                                      READY   STATUS    RESTARTS         AGE     IP               NODE         NOMINATED NODE   READINESS GATES
busybox                                   1/1     Running   1 (3h12m ago)    7h25m   10.244.36.105    k8s-node1    <none>           <none>
front-end-5f64577768-tsq76                1/1     Running   15 (3h12m ago)   10d     10.244.36.99     k8s-node1    <none>           <none>
nfs-client-provisioner-56dd5765dc-9z772   1/1     Running   30 (3h12m ago)   10d     10.244.169.162   k8s-node2    <none>           <none>
nginx-6799fc88d8-ktjxh                    1/1     Running   2 (3h12m ago)    23h     10.244.169.151   k8s-node2    <none>           <none>
root@k8s-master:~# kubectl exec -it -n default nginx-6799fc88d8-ktjxh -- /bin/sh
# curl 10.244.36.96
curl: (28) Failed to connect to 10.244.36.96 port 80: Connection timed out
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5天前
|
存储 运维 Kubernetes
Kubernetes 集群的监控与维护策略
【4月更文挑战第23天】 在微服务架构日益盛行的当下,容器编排工具如 Kubernetes 成为了运维工作的重要环节。然而,随着集群规模的增长和复杂性的提升,如何确保 Kubernetes 集群的高效稳定运行成为了一大挑战。本文将深入探讨 Kubernetes 集群的监控要点、常见问题及解决方案,并提出一系列切实可行的维护策略,旨在帮助运维人员有效管理和维护 Kubernetes 环境,保障服务的持续可用性和性能优化。
|
6天前
|
机器学习/深度学习 人工智能 安全
云端防御战线:云计算环境中的网络安全策略
【4月更文挑战第22天】 在数字化时代,云计算已成为企业运营的关键基础设施。然而,随着其广泛应用,云服务也成为了网络攻击者的主要目标。本文深入探讨了云计算环境下的网络安全挑战,分析了云服务提供者和使用者面临的安全威胁,并提出了综合性的安全策略。这些策略不仅包括传统的加密和身份验证技术,还涉及更先进的入侵检测系统、行为分析和机器学习算法。文章旨在为读者提供一个关于如何在享受云计算带来的便利同时确保数据和操作安全的综合指南。
|
1天前
|
监控 安全 网络安全
|
1天前
|
云安全 安全 网络安全
云端防御:云计算环境中的网络安全策略与实践
【4月更文挑战第27天】 在数字化浪潮中,云计算以其弹性、可扩展和成本效益等优势成为企业IT架构的核心。然而,随着云服务的广泛应用,数据安全和隐私保护问题也愈发凸显。本文深入探讨了云计算环境下的网络安全挑战,并提出了一系列创新的安全策略和最佳实践,旨在帮助企业构建更加安全可靠的云服务环境。
7 3
|
3天前
|
存储 运维 Kubernetes
构建高效自动化运维体系:Ansible与Kubernetes的协同策略
【4月更文挑战第25天】 在当今快速迭代的软件开发过程中,自动化运维已成为提升效率、保证一致性和降低人为错误的关键。本文将探讨如何利用Ansible作为配置管理工具,以及Kubernetes作为容器编排系统,共同构建一个高效、可靠的自动化运维体系。文章首先概述了自动化运维的基本概念及其重要性,随后详细分析了Ansible与Kubernetes在自动化流程中的作用与优势,并通过一系列实践案例,展示了两者如何协同工作以优化部署、扩缩容和灾难恢复等关键运维任务。最后,文中还讨论了在实际应用中可能遇到的挑战及相应的解决策略,为读者提供了一套完整的自动化运维解决方案参考。
|
4天前
|
SQL 监控 安全
网络安全与信息安全:防御前线的关键技术与策略
【4月更文挑战第24天】在数字化时代,数据成为了新的货币,而网络安全则是保护这些宝贵资产不受威胁的保险箱。本文深入探讨了网络安全漏洞的本质、加密技术的进展以及提升个人和企业安全意识的重要性。通过分析当前网络环境中的安全挑战,我们提出了一系列创新的防御机制和实践方法,以期为读者提供一套全面的信息保护方案。
|
4天前
|
存储 SQL 安全
网络安全与信息安全:保护数据的关键策略
【4月更文挑战第24天】 在数字化时代,数据成为了新的货币。然而,随着网络攻击的日益猖獗,如何确保信息的安全和隐私成为了一个亟待解决的问题。本文将深入探讨网络安全漏洞的概念、加密技术的重要性以及提升安全意识的必要性,旨在为读者提供一套综合性的网络安全防护策略。通过对这些关键知识点的分享,我们希望能够增强个人和组织在面对网络威胁时的防御能力。
|
4天前
|
监控 安全 网络安全
云端防御战线:云计算环境下的网络安全与信息保护策略
【4月更文挑战第24天】 随着企业数字化转型的加速,云计算作为提供灵活、可扩展资源的关键平台,其安全性已成为企业关注的焦点。然而,云服务的共享性和开放性给传统的网络安全防护带来了新的挑战。本文将探讨云计算环境中面临的安全威胁,并针对这些威胁提出相应的防护措施和最佳实践,以期为信息安全管理者提供参考和指导。
|
5天前
|
存储 监控 安全
云端防御战线:云计算环境下的网络安全策略与实践
【4月更文挑战第23天】在数字化转型的浪潮中,云计算已成为推动企业敏捷性、可扩展性和成本效率的关键因素。然而,随着数据和服务迁移至云端,传统的网络边界逐渐模糊,给网络安全带来了前所未有的挑战。本文探讨了在多租户云环境中维护信息安全的先进策略和技术,分析了云服务模型(IaaS, PaaS, SaaS)特有的安全风险,并提出了一系列针对性的安全措施和最佳实践。通过深入讨论身份与访问管理、数据加密、入侵检测系统以及合规性监控等关键技术,本文旨在为读者提供一套全面的云计算安全防护框架。
5 0
|
6天前
|
监控 安全 网络安全
云端防御战线:云计算环境下的网络安全与信息保护策略
【4月更文挑战第22天】随着企业和个人用户对云服务的依赖日益加深,云计算环境的安全性成为信息技术领域关注的焦点。本文深入探讨了云计算平台面临的安全威胁、信息安全管理的挑战以及前沿防御技术。通过分析数据加密、身份验证、入侵检测等关键技术在云服务中的应用,提出了一个多层次、综合性的网络安全策略框架。此框架旨在为云服务提供商和使用者提供一套实用的安全保障措施,确保云资源的安全高效运营。