前边的内容包括了安全组在ACK集群中所扮演的角色、安全组与集群网络,以及安全组配置管理方法。在本节中,我们基于阿里云线上海量问题的诊断经验,分享一些典型的与安全组错误配置有关系的问题和解决方案。
托管集群默认把节点ECS和管控ENI(弹性网卡)放在同一个安全组里,根据安全组的特性,这保证了ENI和ECS的网卡之间在VPC网络平面上的互通。如果把节点从集群默认安全组里移除并纳入其他安全组的管理中,就会导致集群管控ENI和节点ECS之间无法通信。
这个问题导致的现象比较常见的有,使用kubectl exec命令无法进入Pod终端做管理,使用kubectl logs命令无法查看Pod日志等。其中kubectl exec命令所返回的报错比较清楚,即从API Server连接对应节点10250端口超时,这个端口的监听者就是Kubelet。

此问题的解决方案有三种:一种是将集群节点重新加入集群创建的安全组,另一种是让节点所在的安全组和集群创建的安全组之间互相授权,最后一种是在两个安全组里使用规则让节点ECS和管控ENI的地址段互相放行。
专有或托管集群的系统组件(如Cloud Controller Manager、Metrics Server、Cluster Auto Scaler等)使用公网地址或运营商级NAT保留地址(100.64.0.0/10)访问阿里云云产品,这些产品包括但不限于负载均衡(SLB)、弹性伸缩(ESS)、对象存储(OSS)。如果安全组限制了集群访问这些地址,则会导致系统组件功能受损。
这个问题导致的现象比较常见的是,在创建服务的时候,Cloud Controller Manager无法访问集群节点Metadata并获取Token值。集群节点以及其上的系统组件通过节点绑定的授权角色访问云资源,如访问不到Token,会导致权限问题。

另外一个现象是,集群无法从阿里云镜像仓库下载容器镜像,导致Pod无法创建。在事件日志中,有明显的访问阿里云镜像仓库时的报错,如图16-3所示。

图16-3 访问镜像仓库报错
此问题的解决方案是,在限制集群出方向的时候,确保运营商级NAT保留地址100.64.0.0/10网段以及阿里云云服务公网地址被放行。其中运营商保留地址比较容易处理,云服务公网地址比较难处理,原因有两个,一个是集群会访问多个云服务且这些云服务的公网地址有可能会更改,另一个是这些云服务可能使用DNS负载均衡,所以需要多次解析这些服务的URL找出所有IP地址并放行。
集群创建的时候,会在安全组里添加容器组网段入方向放行规则。有了这个规则,即使容器组网段和VPC网段不一样,容器组在跨节点通信的时候,也不会受到安全组的限制。如果这个默认规则被移除,那么容器组跨节点通信会失败,进而使得多种集群基础功能受损。
这个问题导致的现象比较常见的有,容器组DNS解析失败、容器组访问集群内部其他服务异常等。如图16-4所示,在容器组网段规则被移除之后,从磁盘控制器里访问阿里云主页则无法解析域名,telnet CoreDNS的地址不通。地址之所以可以访问,是因为安全组默认放行了所有ICMP数据。

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