Kubernetes NetworkPolicy:打造更安全的容器运行环境

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 传统上,通常使用防火墙实现网络层的访问控制,比如iptables rule,部署应用之后,通过iptables设置运行的ip白名单。在使用Kubernetes之后,由于Pod是动态分配到机器上,而且在运行过程中随时可能迁移到其他机器,显然不适合继续使用手工配置iptables的方式。

常见的应用可以分为两大类:Job和Service。Job比较简单,就是一个普通的任务,完成之后就退出,一般不需要暴露对外服务的网络监听端口。Service是指长期运行的进程,监听某个网络端口,其他服务可以通过网络连过来。生产环境里,将服务暴露在网络上存在安全风险:必须限制只有信任的用户才能访问服务。我们肯定不希望未授权的用户能调用某个删除数据的接口,把DB里的数据删光。访问控制可以在应用层做,客户端访问服务时,带上身份校验信息,服务端校验客户身份,判断客户是否有权限完成请求的操作,如果有权限,执行客户端请求,否则返回一个拒绝信息。访问控制还可以在网络层做,只允许受信的网络段访问服务。两种方式各有优劣,应用层可以做到更细粒度的权限控制,但需要开发,并且要求能客户端/服务器在通信协议上支持鉴权。网络层鉴权不依赖具体应用,还有一个额外的好处是能防DDoS。今天的主题NetworkPolicy,就是一种网络层的访问控制机制。

传统上,通常使用防火墙实现网络层的访问控制,比如iptables rule,部署应用之后,通过iptables设置运行的ip白名单。在使用Kubernetes之后,由于Pod是动态分配到机器上,而且在运行过程中随时可能迁移到其他机器,显然不适合继续使用手工配置iptables的方式。好在Kubernetes考虑到这个需求,提供了Network Policy,通过Network Policy,我们不仅能限制哪些Pod能被哪些来源访问,甚至还能控制Pod能访问哪些外部服务。Kubernetes中的Network Policy只定义了规范,并没有提供实现,而是把实现留给了网络插件。阿里云容器服务的Terway支持Network Policy,接下来我们基于Terway介绍几个使用Network Policy的场景。

创建Terway集群

首先,我们要创建一个使用Terway的集群,也就是在创建集群的时候,网络插件选Terway。

Screen_Shot_2018_09_14_at_2_38_47_PM

等待一会,集群创建好。这是我刚刚创建好的集群,名字就叫terway

Screen_Shot_2018_09_14_at_2_39_35_PM

为了操作方便,我们直接用命令行的方式,先下载kubeconfig文件,保存到本地的$HOME/.kube/config

场景1: 限制服务只能被带有特定label的应用访问

首先部署一个nginx,两个实例,附带一个service

~ % kubectl run nginx --image=nginx
deployment.apps "nginx" created
~ % kubectl get pod
NAME                     READY     STATUS    RESTARTS   AGE
nginx-65899c769f-c9s8z   1/1       Running   0          24s
~ % kubectl expose deployment nginx --port=80
service "nginx" exposed
~ % kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   172.19.0.1      <none>        443/TCP   21h
nginx        ClusterIP   172.19.32.113   <none>        80/TCP    20s
AI 代码解读

现在,起一个新应用,访问刚刚创建nginx service

~ % kubectl run busybox --rm -ti --image=busybox /bin/sh

If you don't see a command prompt, try pressing enter.
/ # wget nginx
Connecting to nginx (172.19.32.113:80)
index.html           100% |***************************************************************************************************************************************************|   612  0:00:00 ETA
/ #
AI 代码解读

看上去没问题,网络是通的。接下来我们设置一个Network Policy,只允许带有label access=true的应用访问nginx,其他都不行。开一个新终端

~ % cat policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      run: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"
~ % kubectl apply -f policy.yaml
networkpolicy.networking.k8s.io "access-nginx" created
AI 代码解读

回到运行busybox的终端,再执行一次wget nginx

/ # wget nginx
Connecting to nginx (172.19.32.113:80)

^C
/ #
AI 代码解读

可以看到,在设置完Policy之后,之前启动的busybox已经不能访问nginx了。我们重新启动一个带有label access=true的busybox

~ % kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget nginx
Connecting to nginx (172.19.32.113:80)
index.html           100% |***************************************************************************************************************************************************|   612  0:00:00 ETA
/ #
AI 代码解读

成功!

场景2: 限制能够访问暴露了公网SLB服务的来源IP

给上个场景中的nginx再创建一个LoadBalance类型的service,LoadBalance类型的service会创建一个SLB

~ % cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    run: nginx
  name: nginx-slb
spec:
  externalTrafficPolicy: Local
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: LoadBalancer
~ % kubectl apply -f nginx-service.yaml
service "nginx-slb" created
~ % kubectl get svc nginx-slb
NAME        TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
nginx-slb   LoadBalancer   172.19.89.136   47.95.180.200   80:31967/TCP   17s
AI 代码解读

我们创建了LoadBalance类型的service,SLB的IP是 47.95.180.200,先从本地请求一下试试:

~ % wget 47.95.180.200
--2018-09-14 08:07:23--  http://47.95.180.200/
Connecting to 47.95.180.200:80... ^C
~ %
AI 代码解读

网络不通,因为刚才我们设置了nginx只允许带有label access=true的应用访问,现在是我们从外部访问Kubernetes,根本不是Pod,更不要说设置label了。怎么办?

方案是修改之前创建的Network Policy,增加一个允许访问的来源IP段。把自己本地的IP地址加到白名单里去。先拿到自己的IP地址

~ % curl myip.ipip.net
当前 IP1.2.3.4  来自于:中国 浙江 #我的实际IP不是这个,根据自己的实际情况处理。
AI 代码解读

然后编辑policy.yaml,把IP地址加进去。有些网络的出口IP有多个,所以这里加上了一个/24的段。100.64.0.0/10必须要带上,SLB健康检查地址在这个段里,不加上的话SLB健康检查会出错。

~ % cat policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      run: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"
    - ipBlock:
        cidr: 100.64.0.0/10
    - ipBlock:
        cidr: 1.2.3.0/24
~ % kubectl apply -f policy.yaml
networkpolicy.networking.k8s.io "access-nginx" configured
AI 代码解读

好了,再访问一次

~ % wget 47.95.180.200
--2018-09-14 08:15:03--  http://47.95.180.200/
Connecting to 47.95.180.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 612 [text/html]
Saving to: 'index.html'

index.html                                       100%[=========================================================================================================>]     612  --.-KB/s    in 0s

2018-09-14 08:15:03 (67.6 MB/s) - 'index.html' saved [612/612]
AI 代码解读

网络又通了,完美!

场景3: 限制一个Pod只能访问www.aliyun.com

除了限制当前应用能被谁访问,有时候还要限制应用能访问谁,有时候我们要运行第三方应用,不希望这些应用访问到不该访问的网络。通过Network Policy,也能实现这个需求。

Network Policy只能通过IP地址配置规则,首先我们通过dig获取www.aliyun.com的地址

~ % dig +short www.aliyun.com
www-jp-de-intl-adns.aliyun.com.
www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com.
v6wagbridge.aliyun.com.
v6wagbridge.aliyun.com.gds.alibabadns.com.
140.205.34.3
106.11.93.21
140.205.32.4
140.205.230.13
AI 代码解读

这样就拿到了域名解析到的IP列表。然后编写如下的Network Policy规则:

~ % cat busybox-policy.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: busybox-policy
spec:
  podSelector:
    matchLabels:
      run: busybox
  egress:
  - to:
    - ipBlock:
        cidr: 140.205.230.13/32
    - ipBlock:
        cidr: 140.205.34.3/32
    - ipBlock:
        cidr: 106.11.93.21/32
    - ipBlock:
        cidr: 140.205.32.4/32
  - to:
    - ipBlock:
        cidr: 0.0.0.0/0
    ports:
    - protocol: UDP
      port: 53

~ % kubectl apply -f busybox-policy.yaml
networkpolicy.networking.k8s.io "busybox-policy" configured
AI 代码解读

在这个规则里,我们配置了egress规则,也就是出网规则,限制应用对外访问。允许UDP请求,否则没法做DNS解析。

验证一下

~ % kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # wget www.aliyun.com
Connecting to www.aliyun.com (106.11.93.21:80)
Connecting to www.aliyun.com (140.205.230.13:443)
wget: note: TLS certificate validation not implemented
index.html           100% |***************************************************************************************************************************************************|  526k  0:00:00 ETA
/ #
AI 代码解读
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
太公
+关注
目录
打赏
0
0
0
0
78611
分享
相关文章
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
378 185
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
104 30
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
DeepSeek大解读系列公开课上新!阿里云专家主讲云上智能算力、Kubernetes容器服务、DeepSeek私有化部署
智猩猩「DeepSeek大解读」系列公开课第三期即将开讲,聚焦阿里云弹性计算助力大模型训练与部署。三位专家将分别讲解智能算力支撑、Kubernetes容器服务在AI场景的应用实践、以及DeepSeek一键部署和多渠道应用集成,分享云计算如何赋能大模型发展。欲观看直播,可关注【智猩猩GenAI视频号】预约。 (239字符)
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。

相关产品

  • 容器服务Kubernetes版