9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

深入浅出 Kubernetes 实践篇 (四):集群安全组配置管理

  • 2020-03-30
  • 本文字数:4279 字

    阅读完需:约 14 分钟

深入浅出Kubernetes 实践篇 (四):集群安全组配置管理

阿里云容器产品 Kubernetes 版本,即 ACK,基于阿里云 IaaS 层云资源创建。资源包括云服务器 ECS,专有网络 VPC,弹性伸缩 ESS 等。以这些资源为基础,ACK 产品实现了 Kubernetes 集群的节点,网络,自动伸缩等组件和功能。


一般而言,用户对 ACK 产品有很大的管理权限,这包括集群扩容,创建服务等。与此同时,用户可以绕过 ACK 产品,对集群底层云资源进行修改。如释放 ECS,删除 SLB。如果不能理清背后的影响,这样的修改会损坏集群功能。


这篇文章会以 ACK 产品安全组的配置管理为核心,深入讨论安全组在集群中扮演的角色,安全组在网络链路中所处的位置,以及非法修改安全组会产生的各类问题。文章内容适用于专有集群和托管集群。

安全组在 ACK 产品中扮演的角色

阿里云 ACK 产品有两种基本形态,专有集群和托管集群。这两种形态的最大差别,就是用户对 master 的管理权限。对安全组来说,两种形态的集群略有差别,这里分开讨论。



专有集群使用资源编排 ROS 模板搭建集群的主框架。其中专有网络是整个集群运行的局域网,云服务器构成集群的节点,安全组构成集群节点的出入防火墙。


另外,集群使用弹性伸缩实现动态扩缩容功能,NAT 网关作为集群的网络出口,SLB 和 EIP 实现集群 API Server 的入口。



托管集群与专有集群类似,同样使用资源编排模板搭建集群的主框架。在托管集群中,云服务器,专有网络,负载均衡 SLB,EIP,安全组等扮演的角色专有集群类似。


与专有集群不同的是,托管集群的 master 系统组件以 Pod 的形式运行在管控集群里。这就是用 Kubernetes 管理 Kubernetes 的概念。


因为托管集群在用户的 VPC 里,而管控集群在阿里云生产账号的 VPC 里。所以这样的架构需要解决的一个核心问题,就是跨账号跨 VPC 通信问题。


为了解决这个问题,此处用到类似传送门的技术。托管集群会在集群 VPC 里创建两个弹性网卡,这两个弹性网卡可以像普通云服务器一样,和集群节点通信。但是这两个网卡被挂载到托管集群的 API Server Pod 上,这就解决了跨 VPC 通信问题。

安全组与 ACK 集群网络

上一节总结了两种形态 ACK 集群的组成原理,以及安全组在集群中所处的位置。简单来说,安全组就是管理网络出入流量的防火墙。


安全组规则是基于数据包的目的地址而限流的。出规则需要基于对目标地址的管控需求而定,而入规则则需要对集群内部通信对象有所理解。以下图为例,ACK 集群的内部的通信对象包括集群节点,和部署在集群上的容器组 Pod 两种。



云服务器没有太多特殊的地方,仅仅是简单的连接在 VPC 局域网内的 ECS。而容器组 Pod 是连接在,基于 veth 网口对、虚拟网桥、以及 VPC 路由表所搭建的、和 VPC 独立的虚拟三层网络上的。


总结一下,有两种通信实体和三种通信方式,共六种通信场景。


相同节点通信跨节点通信外部通信
节点无关无关有关
Pod无关无关/有关有关


前三种场景,以节点为通信实体。第一种场景是节点与其上 Pod 通信,这种场景和安全组无关;第二种场景是节点与其他节点以及 Pod 通信,这种场景下,因为节点在相同 VPC 下,且 Pod 访问 Pod 网段以外的地址都会经过 SNAT,所以和安全组无关;第三种场景是节点与 VPC 之外实体通信,这种情况不管出入都与安全组有关。



后三种场景,以容器组 Pod 为主要通信实体。第四种场景是 Pod 在节点内部与 Pod 和 ECS 通信,这种场景和安全组无关;第五种场景是 Pod 跨节点与其他节点以及 Pod 通信,这种场景下,如果源地址和目的地址都是 Pod,则需要安全组入规则放行,其他情况与场景二类似;第六种场景是 Pod 与 VPC 之外实体通信,这与场景三类似。



虽然以上场景有些复杂,但是经过总结会发现,与安全组有关的通信,从根本上说就两种情况。一种是 Pod 之间跨节点通信,另一种是节点或 Pod 与外网互访。这里的外网可以是公网,也可以是与集群互联互通的 IDC 或者其他 VPC。

怎么样管理 ACK 集群的安全组规则

上一节详细分析了安全组在 ACK 集群通信的时候,会影响到的场景。最后的结论是,配置 ACK 集群的安全组,只须考虑两种情况,一个是 Pod 跨节点互访,一个是集群和外网互访。


ACK 集群在创建的时候,默认添加了 Pod 网段放行入规则,与此同时保持出规则对所有地址全开。这使得 Pod 之间互访没有问题,同时 Pod 或节点可以随意访问集群以外的网络。


而在默认规则的基础上对集群安全组的配置管理,其实就是在不影响集群功能的情况下,收紧 Pod 或节点访问外网的能力,和放松集群以外网络对集群的访问。


下边我们分三个常见的场景,来进一步分析,怎么样在默认规则的基础上,进一步管理集群的安全组规则。第一个场景是限制集群访问外网,第二个场景是 IDC 与集群互访,第三个场景是使用新的安全组管理部分节点。

限制集群访问外网

这是非常常见的一个场景。为了在限制集群访问外网的同时,不影响集群本身的功能,配置需要满足三个条件。


  1. 不能限制出方向 Pod 网段

  2. 不能限制集群访问阿里云云服务的内网地址段 100.64.0.0/10

  3. 不能限制集群访问一部分阿里云云服务的公网地址

  4. ecs.cn-hangzhou.aliyuncs.com

  5. ecs-cn-hangzhou.aliyuncs.com

  6. vpc.cn-hangzhou.aliyuncs.com

  7. slb.cn-hangzhou.aliyuncs.com

  8. location-readonly.aliyuncs.com

  9. location.aliyuncs.com

  10. pvtz.cn-hangzhou.aliyuncs.com

  11. cs.cn-hangzhou.aliyuncs.com

  12. nas.cn-hangzhou.aliyuncs.com

  13. oss-cn-hangzhou.aliyuncs.com

  14. cr.cn-hangzhou.aliyuncs.com

  15. metrics.cn-hangzhou.aliyuncs.com

  16. ess.cn-hangzhou.aliyuncs.com

  17. eci.cn-hangzhou.aliyuncs.com

  18. alidns.cn-hangzhou.aliyuncs.com

  19. sls.cn-hangzhou.aliyuncs.com

  20. arms.cn-hangzhou.aliyuncs.com


其中第一条显而易见,第二条为了确保集群可以通过内网访问 DNS 或者 OSS 这类服务,第三条是因为集群在实现部分功能的时候,会通过公网地址访问云服务。

IDC 与集群互访

IDC 与集群互访这种场景,假设 IDC 和集群 VPC 之间,已经通过底层的网络产品打通,IDC 内部机器和集群节点或者 Pod 之间,可以通过地址找到对方。


这种情况下,只需要在确保出方向规则放行 IDC 机器网段的情况下,对入规则配置放行 IDC 机器地址段即可。

使用新的安全组管理节点

某些时候,用户需要新增加一些安全组来管理集群节点。比较典型的用法,包括把集群节点同时加入到多个安全组里,和把集群节点分配给多个安全组管理。


如果把节点加入到多个安全组里,那么这些安全组会依据优先级,从高到低依次匹配规则,


这会给配置管理增加复杂度。而把节点分配给多个安全组管理,则会出现脑裂问题,需要通过安全组之间授权,或者增加规则的方式,确保集群节点之间互通。

典型问题与解决方案

前边的内容包括了安全组在 ACK 集群中所扮演的角色,安全组与集群网络,以及安全组配置管理方法。最后一节基于阿里云售后线上客户海量问题的排查经验,分享一些典型的,与安全组错误配置有关系的问题和解决方案。

使用多个安全组管理集群节点

托管集群默认把节点 ECS 和管控 ENI 弹性网卡放在同一个安全组里,根据安全组的特性,这保证了 ENI 网卡和 ECS 的网卡之间在 VPC 网络平面上的互通。如果把节点从集群默认安全组里移除并纳入其他安全组的管理当中,这导致集群管控 ENI 和节点 ECS 之间无法通行。


这个问题的现象,比较常见的有,使用 kubectl exec 命令无法进去 pod 终端做管理,使用 kubectl logs 命令无法查看 pod 日志等。其中 kubectl exec 命令所返回的报错比较清楚,即从 API Server 连接对应节点 10250 端口超时,这个端口的监听者就是 kubelet。



此问题的解决方案有三种,一个是将集群节点重新加入集群创建的安全组,另一个是对节点所在的安全组和集群创建的安全组之间互相授权,最后一个方式是,在两个安全组里使用规则来互相放行节点 ECS 和管控 ENI 的地址段。

限制集群访问公网或者运营级 NAT 保留地址

专有或托管集群的系统组件,如 cloud controller manager,metrics server,cluster auto scaler 等,使用公网地址或运营商级 NAT 保留地址(100.64.0.0/10)访问阿里云云产品,这些产品包括但不限于负载均衡 SLB,弹性伸缩 ESS,对象存储 OSS。如果安全组限制了集群访问这些地址,则会导致系统组件功能受损。


这个问题的现象,比较常见的有,创建服务的时候,cloud controller manager 无法访问集群节点 metadata 并获取 token 值。集群节点以及其上的系统组件通过节点绑定的授权角色访问云资源,如访问不到 token,会导致权限问题。



另外一个现象是,集群无法从阿里云镜像仓库下载容器镜像,导致 pod 无法创建。在报错中有明显的,访问阿里云镜像仓库的报错。



此问题的解决方案,是在限制集群出方向的时候,确保运营商级 NAT 保留地址 100.64.0.0/10 网段以及阿里云云服务公网地址被放行。其中运营商保留地址比较容易处理,云服务公网地址比较难处理,原因有两个,一个是集群会访问多个云服务且这些云服务的公网地址有可能会更改,另一个是这些云服务可能使用 DNS 负载均衡。所以需要多次解析这些服务的 url 并找出所有 ip 地址并放行。


容器组跨节点通信异常


集群创建的时候,会在安全组里添加容器组网段入方向放行规则。有了这个规则,即使容器组网段和 VPC 网段不一样,容器组在跨节点通信的时候,也不会受到安全组的限制。如果这个默认规则被移除,那么容器组跨节点通信会失败,进而使得多种集群基础功能受损。


这个问题的现象,比较常见的有,容器组 DNS 解析失败,容器组访问集群内部其他服务异常等。如下图,在容器组网段规则被移除之后,从 disk controller 里访问www.aliyun.com则无法解析域名,telnet coredns 的地址不通。地址之所以可以 ping 通的原因,是安全组默认放行了所有 icmp 数据。



此问题解决方案比较简单,就是重新把容器组地址段加入安全组。这类问题的难点在于,其引起的问题非常多,现象千奇百怪,所以从问题现象定位到容器组跨节点通信,是解决问题的关键一步。

结束语

这篇文章从三个方面,深入讨论了阿里云 ACK 产品安全组配置管理。这三个方面分别安全组在集群中扮演的角色,安全组与集群网络,以及常见问题和解决方案。


同时通过分析,可以看到 ACK 产品安全组配置管理的三个重点,分别是集群的外网访问控制,集群容器组之间跨节点访问,以及集群使用多个安全组管理。与这三个重点对于的,就是三类常见的问题。


以上总结会在集群创建之前和创建之后,对集群安全组的规划管理有一定指导意义。


作者简介


罗建龙(花名声东),阿里云技术专家。多年操作系统和图形显卡驱动调试和开发经验。目前专注云原生领域,容器集群和服务网格。


相关阅读


深入浅出Kubernetes 实践篇 (一):节点就绪问题之一


深入浅出Kubernetes 实践篇 (二):节点就绪问题之二


深入浅出Kubernetes 实践篇 (三):命名空间删除问题


活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2020-03-30 17:14850

评论

发布
暂无评论
发现更多内容

域名被劫持应该如何处理

源字节1号

软件开发

大规模C++编译性能优化系统OMAX介绍

百度Geek说

后端

微信朋友圈的高可用复杂度

joak

沉浸式体验网易云信在线 KTV

网易云信

音视频技术

如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用

Jerry Wang

RESTful SAP abap Fiori 5月月更

阿里云移动研发平台EMAS:4月产品动态更新

移动研发平台EMAS

阿里云 用户增长 研发工具 移动测试 移动推送

幸运哈希defi游戏系统开发方案(防作弊)

开发微hkkf5566

监控系统报警级别设定

焦振清

监控系统 报警级别

大数据培训用SQL来实现用户行为漏斗分析

@零度

大数据开发

《0次与10000次》:让坏事发生0次,让好事发生10000次

郭明

锅圈如何利用 Zadig 从容落地运维容器化建设

Zadig

DevOps 云原生 CI/CD 持续交付

喜讯!「凡泰极客」中标「廊坊银行」小程序平台应用建设项目

FinClip

小程序 finclip 廊坊银行

敏捷领导力(CAL E+T+O)认证在线培训 | 2022年8月18-20日

ShineScrum捷行

敏捷 敏捷领导力 CAL 世界级敏捷领导力大师

企业实施知识管理建设的7条建议

小炮

都是限制,都是秘密,JS逆向某建筑市场数据,python爬虫120例

梦想橡皮擦

5月月更

英特尔投资47亿构建巨型实验室所谓何?数据中心已然进入“液冷时代”

蓝海大脑GPU

PHP实现令牌桶限流Redis list列表 Lpush rpop 实现令牌桶 - 限流 PHP实例

Owen Zhang

php

深度学习六十年简史

OneFlow

人工智能 机器学习 深度学习

二、KVM架构概述

穿过生命散发芬芳

kvm 5月月更

【网易云信】沉浸式体验网易云信在线 KTV

网易智企

音视频

【网易云商】TypeScript 进阶指南,突破基本类型

网易智企

typescript

【直播回顾】OpenHarmony知识赋能五期第六课——子系统相机解读

OpenHarmony开发者

OpenHarmony

web前端培训复盘30+技术点(满满干货,建议收藏)

@零度

前端开发

Flink 1.15 新功能架构解析:高效稳定的通用增量 Checkpoint

Apache Flink

大数据 flink 编程 流计算 实时计算

F5 NGINX 核心人员倾力打造,搞懂 NGINX 这一本就够了

图灵教育

nginx 程序员 服务器 计算机

跨平台应用开发进阶(十六) :uni-app实现H5页面唤醒APP

No Silver Bullet

uni-app App 5月月更 H5页面

私有化IM内置专属文档中心,助力企业协作闭环

WorkPlus

java培训如何减少 try-catch,这样做才优雅

@零度

JAVA开发

回顾|Flink CDC Meetup(附 PPT 下载)

Apache Flink

大数据 flink 编程 流计算 实时计算

GraphQL初探

RingCentral铃盛

JavaScript graphql

打造TOB企业流量场,钉钉将推出“视频号”,提升CDN性能是关键

郑州埃文科技

钉钉 CDN加速 IP地址 IP定位 网络优化

  • 扫码添加小助手
    领取最新资料包
深入浅出Kubernetes 实践篇 (四):集群安全组配置管理_文化 & 方法_罗建龙(声东)_InfoQ精选文章